Jdbc 使用连接池一段时间后自动将更改提交为TRUE
我遇到了一些奇怪的问题 我使用池来创建和管理数据库连接,我将Jdbc 使用连接池一段时间后自动将更改提交为TRUE,jdbc,connection-pooling,Jdbc,Connection Pooling,我遇到了一些奇怪的问题 我使用池来创建和管理数据库连接,我将DefaultAutocommit选项设置为FALSE 但过了一段时间,当发生错误并调用回滚时,会引发异常:无法在autocommit=true时调用回滚 重新启动JBoss将解决这个问题,因为将创建一个新的数据源 以下是我创建数据源的方式: protected DataSource getDataSource(String driverClassName, String dbUrl, String dbUser, String dbP
DefaultAutocommit
选项设置为FALSE
但过了一段时间,当发生错误并调用回滚时,会引发异常:无法在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)
下面是今天的情况,我在池创建的每个连接上强制使用AutoCommit
属性
这是可行的,所以它肯定是pool类的一个bug
编辑:
我也有一个事务隔离的问题,它是以相同的方式设置的,但没有考虑到。经过一些研究,我发现这可能与我使用的Mysql连接器/J()有关
我在文档中发现了这个有趣的参数:
使用LocalSessionState
驱动程序是否应参考autocommit和的内部值
由Connection.setAutoCommit()和
Connection.setTransactionIsolation()和事务状态为
由协议维护,而不是查询数据库或
盲目向数据库发送commit()或rollback()命令
方法调用
默认值:false能否提供错误堆栈跟踪?很可能是连接池或MySQL JDBC驱动程序中的错误。除此之外,我认为这个问题是无法回答的。@markrottveel好吧,我没有发现任何这样一个bug的痕迹。但我们将尝试直接在连接上强制该属性。如果那样做的话,可能会对其他人有所帮助。