6

奇妙な問題が発生しました。

プールを使用してDB接続を作成および管理し、DefaultAutocommitオプションをに設定しますFALSE

しかし、しばらくして、エラーが発生し、arollbackが呼び出されると、例外がスローされます。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)
4

1 に答える 1

2

これが今日AutoCommitの状況です。プールによって作成された各接続に属性を強制します。

これは機能するので、間違いなくプールクラスのバグである可能性があります。

編集:同じ方法で設定されたが考慮されていないトランザクション分離にも問題がありました。いくつかの調査の結果、これはMysqlコネクタ/ JIの使用( http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html )に関連している可能性があることがわかりました。

私はこの興味深いパラメータをドキュメントで見つけました:

useLocalSessionState

ドライバーは、データベースにクエリを実行したり、データベースにコマンドをやみくもに送信したりするのではなく、Connection.setAutoCommit()とConnection.setTransactionIsolation()によって設定された自動コミットとトランザクション分離の内部値、およびプロトコルによって維持されるトランザクション状態を参照する必要があります。 commit()またはrollback()メソッド呼び出し?

デフォルト値: false

于 2012-08-08T09:23:44.070 に答える