2012-07-09 62 views
5

我得到了一些奇怪的問題,一段時間後變爲真。自動提交使用連接池

我使用Pool創建和管理數據庫連接,我將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) 
+0

你能提供錯誤的堆棧跟蹤? – 2012-07-09 11:57:27

+0

很可能它是連接池或MySQL JDBC驅動程序中的錯誤。除此之外,我認爲這個問題是無法回答的。 – 2012-07-09 17:15:56

+0

@MarkRotteveel我沒有找到任何這樣的錯誤的痕跡。但是我們會嘗試直接強制連接上的屬性。如果這項工作可以幫助其他人。 – 2012-07-10 07:24:15

回答

2

因此,這裏是今天的十分到位,我強迫在池中創建每個連接在AutoCommit屬性。

這工作,所以它肯定可能是池類的錯誤。

編輯: 我也有與設置方式相同,但沒有考慮到事務隔離的問題。經過一番研究後,我發現這可能與我使用的Mysql連接器/ J有關(http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html)。

我發現在doc這個有趣的參數:

useLocalSessionState

如果司機指的是由Connection.setAutoCommit設置自動提交和 事務隔離的內部值()和 Connection.setTransactionIsolation()和交易狀態 由協議維護,而不是在數據庫或 盲目地將命令發送到查詢的數據庫commit()或RO llback() 方法調用?

默認值: