tomcat jdbc 池在连接重用方面有一些不同的行为

tomcat jdbc pool has some different behaviour about connection reuse

我已经在我的 Web 应用程序中配置了 Tomcat JDBC 池,并添加了版本 8.0.38 的 Maven 依赖项,这也是我的 tomcat 版本。现在我从该池获取连接并检查 autoCommit 属性 的值,它是 "true" 然后我将该连接的 autoCommit 设置为 "false"。然后我提交事务,然后关闭该连接。现在我从池中获得另一个连接并检查 autoCommit 属性 的值,它是 "false"。但我期待它是真的。我还使用 Apache Common DBCP2 池库,但没有这种行为。每当我从公共 DBCP2 池获得连接时,它的 return 连接与 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  " );

以上代码的输出是

false con1
false con2

<bean id="basicDataSourceWrite" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="${mysqlEndpointWrite}" />
    <property name="username" value="${mysqlUserWrite}" />
    <property name="password" value="${mysqlPasswordWrite}" />
    <property name="defaultAutoCommit" value="true" />
    <property name="initialSize" value="4" />
    <property name="maxActive" value="5" />
</bean>

此处将 defaultAutoCommit 设置为 "true" 甚至对我不起作用。它总是 return 与 autoCoomit false 的连接。

所以我想知道常见的 DBCP2 如何管理这个以及如何在 tomcat JDBC 池中实现这个?

这是 known bug Tomcat JDBC.

的一个 known bug(或者更确切地说是一个功能,因为它尚未修复)

设置 defaultAutoCommit 的值是不够的,您还需要启用 interceptors,这将实际执行这些设置。这将使 defaultAutoCommit 值影响连接。

<property name="jdbcInterceptors" value="ConnectionState" />