2013-01-28 28 views
5

सेट करने के बाद भी MySQL समय के लिए डाटाबेस कनेक्शन मेरे पास एक ऐसा ऐप है जो H3P0 (v0.9.1.2) द्वारा प्रदान किए गए कनेक्शन पूलिंग के साथ हाइबरनेट (v3.6.4) का उपयोग करता है।c3p0.testConnectionOnCheckout = true

समस्या यह है कि अगर मैं एक डीबी क्वेरी करता हूं, तो मुझे एक जेडीबीसी संचार लिंक विफलता मिलती है, यदि ऐप प्रक्रिया (और इसलिए सी 3 पी 0 पूल) MySQL wait_timeout मान से अधिक समय के लिए चल रही है। मैं इस मुद्दे के परीक्षण के लिए 600 सेकंड के लिए /etc/mysql/my.cnf में wait_timeout का मान सेट:

2013-01-27 20:08:00,088 ERROR [Thread-0] (JDBCExceptionReporter.java:234) - Communications link failure 

The last packet successfully received from the server was 665,943 milliseconds ago. The last packet sent successfully to the server was 6 milliseconds ago. 
org.hibernate.exception.JDBCConnectionException: could not execute query 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
at org.hibernate.loader.Loader.doList(Loader.java:2536) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) 
at org.hibernate.loader.Loader.list(Loader.java:2271) 
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119) 
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716) 
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347) 
..... 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 
The last packet successfully received from the server was 665,943 milliseconds ago. The last packet sent successfully to the server was 6 milliseconds ago. 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3102) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2991) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3532) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127) 
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2293) 
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) 
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) 
at org.hibernate.loader.Loader.doQuery(Loader.java:802) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
at org.hibernate.loader.Loader.doList(Loader.java:2533) 
... 9 more 
Caused by: java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. 
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:2552) 
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3002) 
... 22 more 

2013-01-27 20:19:00,179 WARN [Thread-0] (NewPooledConnection.java:487) - [c3p0] Another error has occurred [ com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 1,326,037 milliseconds ago. The last packet sent successfully to the server was 660,100 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. ] which will not be reported to listeners! 
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 1,326,037 milliseconds ago. The last packet sent successfully to the server was 660,100 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) 
at java.lang.reflect.Constructor.newInstance(Unknown Source) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) 
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3364) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1983) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127) 
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2293) 
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) 
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
at org.hibernate.loader.Loader.getResultSet(Loader.java:1953) 
at org.hibernate.loader.Loader.doQuery(Loader.java:802) 
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274) 
at org.hibernate.loader.Loader.doList(Loader.java:2533) 
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276) 
at org.hibernate.loader.Loader.list(Loader.java:2271) 
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:119) 
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1716) 
at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:347) 
.... 
Caused by: java.net.SocketException: Broken pipe 
at java.net.SocketOutputStream.socketWrite0(Native Method) 
at java.net.SocketOutputStream.socketWrite(Unknown Source) 
at java.net.SocketOutputStream.write(Unknown Source) 
at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
at java.io.BufferedOutputStream.flush(Unknown Source) 
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3345) 
... 20 more 

यह एक आम मुद्दा की तरह दिखाई देता इसका समाधान करने के क्रम में ऐसा है, तो मैं धुन इन हाइबरनेट की कोशिश की है

प्रासंगिक हाइबरनेट गुण: हाइबरनेट/c3p0 प्रलेखन और जवाब की जाँच के बाद/c3p0 गुण पहले से ही स्टैक ओवरफ़्लो पर पूछे जाने वाले प्रश्नों

<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/gsui?useUnicode=true&amp;characterEncoding=UTF-8&amp;autoReconnect=true</property> 

<property name="hibernate.connection.autoReconnect">true</property> 

<!-- C3p0 Performance Improvements --> 
<property name="hibernate.c3p0.acquire_increment">1</property> 
<property name="hibernate.c3p0.idle_test_period">300</property> 
<property name="hibernate.c3p0.maxConnectionAge">3600</property> 
<property name="hibernate.c3p0.timeout">120</property> 
<property name="hibernate.c3p0.max_size">300</property> 
<property name="hibernate.c3p0.min_size">1</property> 
<property name="hibernate.c3p0.max_statements">100</property> 
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property> 

<property name="hibernate.connection.useUnicode"> 
    true 
</property> 
<property name="hibernate.connection.characterEncoding"> 
    UTF-8 
</property> 
<property name="hibernate.connection.charSet"> 
    UTF-8 
</property> 

मैं भी एक c3p0 गुण में सच करने के लिए c3p0.testConnectionOnCheckout सेट दाखिल मैं बनाए रखने के :

c3p0.testConnectionOnCheckout=true 

लॉग में, C3P0 पूल निम्न संदेश के साथ ठीक initializes:

2013-01-27 19:45:04,607 INFO [main] (ConnectionProviderFactory.java:173) - Initializing connection provider: org.hibernate.connection.C3P0ConnectionProvider 
2013-01-27 19:45:04,609 INFO [main] (C3P0ConnectionProvider.java:103) - C3P0 using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://localhost:3306/gsui?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true 
2013-01-27 19:45:04,610 INFO [main] (C3P0ConnectionProvider.java:104) - Connection properties: {useUnicode=true, autoReconnect=true, user=root, password=****, shutdown=true, characterEncoding=UTF-8, charSet=UTF-8} 
2013-01-27 19:45:04,610 INFO [main] (C3P0ConnectionProvider.java:107) - autocommit mode: false 
2013-01-27 19:45:04,629 INFO [main] (MLog.java:80) - MLog clients using log4j logging. 
2013-01-27 19:45:04,757 INFO [main] (C3P0Registry.java:204) - Initializing c3p0-0.9.1.2 [built 21-May-2007 15:04:56; debug? true; trace: 10] 
2013-01-27 19:45:04,842 INFO [main] (C3P0ConnectionProvider.java:194) - JDBC isolation level: READ_COMMITTED 
2013-01-27 19:45:04,871 INFO [main] (AbstractPoolBackedDataSource.java:462) - Initializing c3p0 pool... [email protected] [ connectionPoolDataSource -> [email protected] [ acquireIncrement -> 1, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, debugUnreturnedConnectionStackTraces -> false, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> z8kfsx8sz4pted1s4b69w|51f726b9, idleConnectionTestPeriod -> 300, initialPoolSize -> 1, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 3600, maxIdleTime -> 120, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 300, maxStatements -> 100, maxStatementsPerConnection -> 0, minPoolSize -> 1, nestedDataSource -> [email protected] [ description -> null, driverClass -> null, factoryClassLocation -> null, identityToken -> z8kfsx8sz4pted1s4b69w|454b7177, jdbcUrl -> jdbc:mysql://localhost:3306/gsui?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true, properties -> {useUnicode=true, autoReconnect=true, user=******, password=******, shutdown=true, characterEncoding=UTF-8, charSet=UTF-8} ], preferredTestQuery -> select 1;, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> true, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false; userOverrides: {} ], dataSourceName -> null, factoryClassLocation -> null, identityToken -> z8kfsx8sz4pted1s4b69w|71ffd9f1, numHelperThreads -> 3 ] 

ऊपर लॉग से, एक C3P0 में है कि testConnectionOnCheckout = सच और autoReconnect = सच पाता है। क्या कोई मुझे यह समझने में मदद कर सकता है कि क्यों सी 3 पी 0 एक टाइम-आउट कनेक्शन की जांच करता है? धन्यवाद।

+0

क्या आप शायद लंबी अवधि के लिए कनेक्शन या हाइबरनेट सत्र खोल रहे हैं? (आदर्श रूप से, कनेक्शन पूल का उपयोग करते समय, कनेक्शनों को चेक-आउट, प्रयुक्त, और तुरंत बंद किया जाना चाहिए। लेकिन कुछ एप्लिकेशन कनेक्शन/कैश कनेक्शन रखते हैं।) –

+0

त्वरित उत्तर के लिए धन्यवाद; आप यहां पैसे पर लग रहे हैं। मेरा ऐप एचडीएल और हाइबरनेट के शीर्ष पर बैठे पुराने उपयोग पुस्तकालय में डीएओ परत का उपयोग करता है। मैंने पाया कि बेस-क्लास डीएओ को अपनी ऑब्जेक्ट क्लास को एक यूटिलिटी क्लास से बाहर कर दिया जाता है जो सिंगलटन सत्र फैक्ट्री को परिभाषित करता है और इसकी "getCurrentSession()" विधि (जो समस्या दिखता है) कहता है। मैंने मूल रूप से सोचा था कि हाइबरनेट सत्र केवल सी 3 पी 0 से कनेक्शन उधार लेता है और कनेक्शन ऑब्जेक्ट ही नहीं है। –

+0

मेरे पास एक ही f *** समस्या है, और मैंने अपने कोड की समीक्षा की है जो खुले-लेकिन-बंद-इन-इंडिकेटली सत्र ऑब्जेक्ट्स की तलाश में नहीं है, और फिर भी मुझे समस्या है। सिर्फ पूर्णता के लिए, मुझे यह अन्य प्रश्न मिला है जो मदद कर सकता है: http://stackoverflow.com/questions/15752667/warn-sqlexceptionhelper143-sql-error-0-sqlstate-08s01-scllexceptionhelper। सबसे बुरी बात यह है कि समस्या विकास पर कभी नहीं उभरती, इससे कोई फर्क नहीं पड़ता कि मैं पुन: उत्पन्न करने के लिए क्या कर रहा हूं (सबसे स्पष्ट मामलों को छोड़कर)। –

उत्तर

1

अपनी हाइबरनेट कॉन्फ़िगरेशन फ़ाइल में नीचे दी गई संपत्ति जोड़ें। मुझे उम्मीद है कि यह काम करेगा।

<property name="connection.provider_class"> 
    org.hibernate.connection.C3P0ConnectionProvider 
</property> 
4

हम जब हम कनेक्शन पूलिंग के लिए JPA और C3P0 का उपयोग कर 4.3.x को हाइबरनेट उन्नत बनाया एक ही "संचार लिंक" मुद्दा होने लगा।

ऐसा लगता है कि यह एक कनेक्शन पूल मुद्दा होगा क्योंकि कनेक्शन को मेरे C3P0 सेटिंग्स के बावजूद डेटाबेस wait_timeout (जो डिफ़ॉल्ट 8 घंटे था) से अधिक रखा जा रहा था। हालांकि, मैं के साथ हमारे persistence.xml में हाइबरनेट विन्यास को बदलने के द्वारा समस्या का समाधान हो:

<property name="hibernate.connection.release_mode" value="after_transaction" /> 

यह हाइबरनेट में डिफ़ॉल्ट व्यवहार लेनदेन के बाद कनेक्शन जारी नहीं करने के लिए बदल रहा है, तो आप स्पष्ट रूप से इस मोड अगर आप 'स्थापित करने के लिए है पूलिंग का उपयोग कर रहे हैं।