2

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

上面代码的输出是

假con1
假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”甚至对我不起作用。它总是返回 autoCoomit false 的连接。

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

4

1 回答 1

0

这是 Tomcat JDBC 的一个已知错误(或者说是一个尚未修复的特性)。

设置 的值defaultAutoCommit是不够的,您还需要启用拦截器,它实际上会强制执行这些设置。这将使该defaultAutoCommit值影响连接。

<property name="jdbcInterceptors" value="ConnectionState" />
于 2018-02-22T08:14:10.183 回答