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