作为一个CSDN新人,第一次记录自己在项目中遇到的问题,希望能给看到的朋友一点帮助。
在最近的一次项目中,遇到的了Connection holder is null 的问题,发现问题后开始去网上找,结果发现是druid连接池的问题,一开始按照网上的很多教程去修改了配置文件,例如下面两种:
1、将removeAbandonedTimeout的超时回收时间从180S改成1800秒
2、将超时回收连接removeAbandoned从true改为false
但是在我的项目中,修改这两个配置并没有解决我的问题,后面是在网上看到的一篇博客中有说到,有可能是事务启动后,既没有提交也没有回滚,至于为什么会出现这种情况,以我自己的项目为例,至于为什么我手动启动事务,这是因为我们项目业务上的需求
// 2.获取事务定义
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// 3.设置事务隔离级别,开启新事务
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
// 4.获得事务状态
TransactionStatus status = transactionManager.getTransaction(def);
try {
ProcModel returnInfo = exec.execProc(procModel);
if () {
//提交事务
transactionManager.commit(status);
successNum++;
} else {
//回滚事务
transactionManager.rollback(status);
}
} catch (Exception e) {
// 异常,回滚事务
transactionManager.rollback(status);
throw new WJRuntimeException("99999", e.getMessage());
}
在此处,一开始是没有加入try catch进行异常的捕捉,导致在exec.execProc(procModel);中遇到异常后直接抛到前端,后台并没有对异常进行处理,从而手动开启的事务并没有做提交和回滚,从而导致了connection holder is null的问题。在对异常进行捕捉后这个问题就解决了。
如果有什么不对的地方欢迎指出,感谢!
如转载请表明出处,谢谢!