使用连接池一段时间后,自动提交更改为TRUE(Auto-commit changes to TRUE

2019-09-19 05:28发布

我得到了一些奇怪的问题。

我用一个池来创建和管理数据库连接,我的设置DefaultAutocommit选项FALSE

但是,一段时间后,当错误发生和rollback被称为抛出异常: Can't call rollback when autocommit=true

重振JBoss会解决这个问题作为一个新的数据源将被创建。

这是我如何创建我的数据源:

protected DataSource getDataSource(String driverClassName, String dbUrl, String dbUser, String dbPwd) {
    PoolProperties poolProperties = new PoolProperties();
    poolProperties.setUrl(dbUrl);
    poolProperties.setDriverClassName(driverClassName);
    poolProperties.setUsername(dbUser);
    poolProperties.setPassword(dbPwd);

    poolProperties.setDefaultAutoCommit(false);
    poolProperties.setTestWhileIdle(false);
    poolProperties.setTestOnBorrow(true);
    poolProperties.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
    poolProperties.setValidationQuery("SELECT 1");
    poolProperties.setTestOnReturn(false);
    poolProperties.setLogAbandoned(false);
    poolProperties.setRemoveAbandoned(true);
    poolProperties.setRemoveAbandonedTimeout(20);
    poolProperties.setMaxActive(100);
    poolProperties.setInitialSize(10);
    poolProperties.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");

    return new DataSource(poolProperties);
}

我该如何得到连接:

xxx.getDataSource().getConnection();

我没有尝试还没有,但我的第一个电话会直接强制自动提交使用的连接setAutoCommit(false)

虽然我不明白为什么poolProperties.setDefaultAutoCommit(false); 正在停止做的工作。

堆栈跟踪 :

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Can't call rollback when autocommit=true
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:409)
    at com.mysql.jdbc.Util.getInstance(Util.java:384)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:929)
    at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:4805)
    at sun.reflect.GeneratedMethodAccessor302.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:125)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94)
    at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:71)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:94)
    at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:140)
    at $Proxy333.rollback(Unknown Source)

Answer 1:

因此,这里是今天的十分到位,我强制AutoCommit属性由池中创建每个连接上。

这工作,所以它肯定可能是池类的错误。

编辑:我也有与设置方式相同,但没有考虑到事务隔离的问题。 经过一番研究,我发现,这可能与MySQL的连接器/ JI使用( http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html )。

我发现在doc这个有趣的参数:

useLocalSessionState

如果驾驶员参见)由Connection.setAutoCommit()和Connection.setTransactionIsolation(设置自动提交和事务隔离和交易状态的内部值作为保持由协议,而不是查询数据库或盲目地发送命令到数据库commit()或rollback()方法调用?

默认值:false



文章来源: Auto-commit changes to TRUE after a while using a connection pool