2012-07-09 20 views
5

का उपयोग करते हुए कुछ समय बाद 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(); 

मैं अभी तक की कोशिश नहीं की, लेकिन मेरी पहली कॉल autocommit सीधे मजबूर करने के लिए किया जाएगा 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

उपलब्ध कराने जा सका त्रुटि स्टैक ट्रेस? –

+0

सबसे अधिक संभावना है कि यह कनेक्शन पूल या MySQL जेडीबीसी ड्राइवर में एक बग है। इसके अलावा, मुझे लगता है कि यह सवाल असंभव है। –

+0

@MarkRotteveel खैर मुझे इस तरह की एक बग का कोई निशान नहीं मिला। लेकिन हम कनेक्शन पर विशेषता को सीधे बल देने की कोशिश करेंगे। यह काम करने पर अन्य मदद कर सकता है। –

उत्तर

2

तो यहाँ क्या जगह में आज है, मैं पूल द्वारा बनाई गई प्रत्येक कनेक्शन पर AutoCommit विशेषता बाध्य करते हैं।

यह काम करता है, इसलिए यह निश्चित रूप से पूल कक्षाओं का एक बग हो सकता है।

संपादित करें: मुझे लेनदेन अलगाव के साथ भी समस्या थी जो उसी तरह से सेट की गई थी लेकिन खाते में नहीं लिया गया था। कुछ शोध के बाद मैंने पाया कि यह माइस्क्ल कनेक्टर/जे I (http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html) से संबंधित हो सकता है।

मैं दस्तावेज़ में इस दिलचस्प पैरामीटर पाया:

useLocalSessionState

ड्राइवर कि Connection.setAutoCommit द्वारा स्थापित कर रहे हैं autocommit और लेनदेन अलगाव के आंतरिक मूल्यों का उल्लेख करना चाहिए() और कनेक्शन.सेट ट्रांज़ेक्शन इन्सोलेशन() और लेनदेन स्थिति डेटाबेस या से पूछताछ के बजाय प्रोटोकॉल द्वारा बनाए गए प्रोटोकॉल द्वारा बनाए गए, प्रतिबद्धता() या ro के लिए डेटाबेस को अंधाधुंध भेजना llback() विधि कॉल?

डिफ़ॉल्ट मूल्य: झूठी

संबंधित मुद्दे