Автоматическая фиксация изменений в TRUE через некоторое время с использованием пула соединений

У меня возникла какая-то странная проблема.

Я использую пул для создания и управления подключениями к БД, я установил для параметра 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)

person Michael Laffargue    schedule 09.07.2012    source источник
comment
Не могли бы вы предоставить трассировку стека ошибок?   -  person Hardik Mishra    schedule 09.07.2012
comment
Скорее всего, это ошибка либо в пуле соединений, либо в драйвере MySQL JDBC. Кроме этого, я думаю, что этот вопрос не имеет ответа.   -  person Mark Rotteveel    schedule 09.07.2012
comment
@MarkRotteveel Ну, я не нашел никаких следов такой ошибки. Но мы попробуем принудительно применить атрибут к соединению напрямую. Это может помочь другим, если это сработает.   -  person Michael Laffargue    schedule 10.07.2012


Ответы (1)


Итак, вот что получилось сегодня: я задаю атрибут AutoCommit для каждого соединения, созданного пулом.

Это работает, так что это определенно может быть ошибка классов пула.

Изменить: у меня также была проблема с изоляцией транзакций, которая была установлена ​​таким же образом, но не учитывалась. После некоторых исследований я обнаружил, что это может быть связано с коннектором Mysql/J, который я использую (http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html).

Я нашел этот интересный параметр в документе:

useLocalSessionState

Должен ли драйвер ссылаться на внутренние значения автофиксации и изоляции транзакций, которые устанавливаются Connection.setAutoCommit() и Connection.setTransactionIsolation(), а также на состояние транзакции, поддерживаемое протоколом, вместо того, чтобы запрашивать базу данных или слепо отправлять команды в базу данных для вызовы методов commit() или rollback()?

Значение по умолчанию: ложь

person Michael Laffargue    schedule 08.08.2012