2012-07-09 9 views
5

Tôi gặp phải một số vấn đề lạ.Tự động cam kết thay đổi TRUE sau một thời gian sử dụng hồ bơi kết nối

Tôi sử dụng Hồ bơi để tạo và quản lý các kết nối DB, tôi đặt tùy chọn DefaultAutocommit thành FALSE.

Nhưng sau một thời gian, khi một lỗi xảy ra và một rollback được gọi là một ngoại lệ được ném: Can't call rollback when autocommit=true

tái giới thiệu những JBoss sẽ giải quyết vấn đề như một DataSource mới sẽ được tạo.

Sau đây là cách tôi tạo Datasource của tôi:

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); 
} 

Và làm thế nào tôi có được các kết nối:

xxx.getDataSource().getConnection(); 

Tôi không thử được nêu ra nhưng cuộc gọi đầu tiên của tôi sẽ là để buộc các autocommit trực tiếp trên kết nối bằng cách sử dụng setAutoCommit(false).

Mặc dù tôi không hiểu tại sao poolProperties.setDefaultAutoCommit(false); ngừng thực hiện công việc.

Stack trace:

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

Ông có thể cung cấp lỗi stack trace? –

+0

Rất có thể đó là lỗi trong nhóm kết nối hoặc trình điều khiển JDBC của MySQL. Ngoài ra, tôi nghĩ câu hỏi này không thể trả lời được. –

+0

@MarkRotteveel Tôi không tìm thấy dấu vết nào của một lỗi như vậy. Nhưng chúng tôi sẽ cố gắng buộc thuộc tính trên kết nối trực tiếp. Nó có thể giúp khác nếu công việc đó. –

Trả lời

2

Vì vậy, đây là những gì được đặt ra ngày hôm nay, tôi buộc các thuộc tính AutoCommit trên mỗi kết nối được tạo ra bởi các hồ bơi.

Công trình này, do đó, chắc chắn có thể là lỗi của các lớp học trong hồ bơi.

Chỉnh sửa: Tôi cũng gặp sự cố với cách ly giao dịch được đặt theo cùng một cách nhưng không được tính đến. Sau khi một số nghiên cứu tôi thấy rằng điều này có thể liên quan đến kết nối Mysql/J tôi sử dụng (http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html).

tôi thấy thông số thú vị này trong doc:

useLocalSessionState

người lái xe nên tham khảo các giá trị nội tại của autocommit và cô lập giao dịch được thiết lập bởi Connection.setAutoCommit() và Connection.setTransactionIsolation() và trạng thái giao dịch là được duy trì bởi giao thức, thay vì truy vấn cơ sở dữ liệu hoặc gửi lệnh một cách mù quáng tới cơ sở dữ liệu cho commit() hoặc ro llback() cuộc gọi phương thức?

Giá trị mặc định: sai