tomcat连接池的“bug”

Tomcat 连接池是从 Tomcat 7 开始重新编写的高并发连接池,用以取代以前 Tomcat 中使用的 DBCP 1 连接池,它可以配置在 Tomcat 中使用,也可以单独使用。

 

【注意的地方】:

在web应用程序中配置了Tomcat JDBC池,并使用Tomcat8.0.38添加了maven依赖项。从该池获取连接并检查autoCommit属性的值,它为“true”,然后将该连接的autoCommit设置为“false”。然后提交了事务,用完关闭该连接。

现在另一个程序从池中获得另一个连接,并检查autoCommit属性的值,它是“false”。但我原以为是true,毕竟是新连接。

后来使用Apache Common DBCP2池库,它没有这种行为。每当我从公共DBCP2池获取连接时,它都会返回autoCommit设置为“true”的连接。

我已经测试并看到了tomcat jdbc池的这种行为。

Connection con1 = basicDataSourceWrite.getConnection();
con1.setAutoCommit(false);
System.out.println(con1.getAutoCommit()+ " con1  " );
con1.commit();
con1.close();

Connection con2 = basicDataSourceWrite.getConnection();
System.out.println(con2.getAutoCommit()+ " con2  " );

 

Output of above code is

false con1
false con2

 

这是Tomcat JDBC的一个已知错误(或者说是一个尚未修复的特性)。仅设置defaultAutoCommit的值是不够的,还需要启用拦截器,拦截器将实际执行这些设置。这将使defaultAutoCommit值影响连接。

 

参考:

     https://stackoverflow.com/questions/48921625/tomcat-jdbc-pool-has-some-different-behaviour-about-connection-reuse

     https://coderanch.com/t/583969/databases/Tomcat-connection-pool-auto-commit

posted @ 2022-09-23 22:39  茁壮的小草  阅读(130)  评论(0编辑  收藏  举报