2012-05-03 15 views
7

मैं कुछ जेडीबीसी संचालन निष्पादित करने के लिए हाइबरनेट के साथ एक सी 3 पी 0 कनेक्शन पूल का उपयोग कर रहा हूं। हालांकि, मुझे उपयोग के कुछ समय बाद "बंद कनेक्शन" (SQL त्रुटि: 17008, SQLState: null) त्रुटि मिल रही है।क्या DoWork() के "कनेक्शन" तर्क को बंद किया जाना चाहिए?

मैं org.hibernate.jdbc.Work इंटरफ़ेस का उपयोग कर रहा मेरी कार्रवाई करने:

public class ClassThatDoesWork implements Work { 

    @Override 
    public void execute(final Connection connection) 
      throws SQLException { 

     doSomeWork(); 
     //should connection be closed here? 
    } 
} 

मेरा प्रश्न है: connection वस्तु execute() विधि के लिए एक तर्क के रूप में पारित उस विधि के अंत में बंद किया जाना चाहिए या हाइबरनेट ख्याल रखता है उसके लिए स्वचालित रूप से?

संपादित ये हाइबरनेट और c3p0 पैरामीटर का उपयोग किया हैं:

hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver 
hibernate.connection.pool_size=10 
hibernate.dialect=org.hibernate.dialect.Oracle9iDialect 
hibernate.connection.provider_class=org.hibernate.connection.C3P0ConnectionProvider 
hibernate.show_sql=false 
acquireIncrement=3 
acquireRetryDelay=500 
acquireRetryAttempts=5 
breakAfterAcquireFailure=false 
checkoutTimeout=0 
connectionTesterClassName=com.mchange.v2.impl.DefaultConnectionTester 
debugUnreturnedConnectionStackTraces=false 
dataSourceName=irrelevantDB 
identityToken=irrelevantDB 
idleConnectionTestPeriod=0 
initialPoolSize=3 
maxConnectionAge=0 
maxIdleTime=7200 
maxIdleTimeExcessConnections=0 
maxPoolSize=20 
maxStatements=50 
maxStatementsPerConnection=0 
minPoolSize=5 
numHelperThreads=3 
propertyCycle=0 
testConnectionOnCheckin=false 
testConnectionOnCheckout=true 
unreturnedConnectionTimeout=0 
hibernate.c3p0.min_size=5 
hibernate.c3p0.max_size=20 
hibernate.c3p0.timeout=10 
hibernate.c3p0.max_statements=50 
+0

हर बार जब मैं C3P0 का उपयोग करता हूं, तो इसकी सेटिंग्स हाइबरनेट उपसर्ग के बिना निर्दिष्ट होती हैं। अर्थात। c3p0.min_size = 5 hibernate.c3p0.min_size = 5 के बजाय। कृपया मेरे उत्तर के अनुसार c3p0.idle_test_period सेटिंग भी आज़माएं। – 01es

+0

कृपया देखें [c3p0 दस्तावेज का यह हिस्सा] (http://www.mchange.com/projects/c3p0/index.html#hibernate- विशिष्ट)। गुण वास्तव में "hibernate.c3p0" के साथ prefixed हैं। एक बार जब मैं c3p0.idle_test_period सेटिंग आज़माता हूं तो मैं वापस आऊंगा। – nekojsi

+0

क्षमा करें, यह पता चला है कि हम C3P0 का उपयोग नहीं कर रहे थे, क्योंकि इसे निर्भरता के रूप में सही ढंग से नहीं चुना गया था, इसलिए यह c3p0.idle_test_period संपत्ति के बावजूद, "कनेक्शन बंद" समस्या को ठीक कर देगा। हालांकि, मुझे अभी भी दिलचस्पी है यदि 'कोड' ऑब्जेक्ट को मेरे कोड द्वारा रखा जाना चाहिए या हाइबरनेट स्वचालित रूप से इसकी देखभाल करता है। – nekojsi

उत्तर

8

डेटाबेस कनेक्शन हाइबरनेट द्वारा एक विधि तर्क के रूप में में पारित हो जाता है, और इस तरह से परीक्षा नहीं किया जाना चाहिए (उदाहरण के लिए बंद कर दिया) विधि के अंदर - - यह हाइबरनेट की ज़िम्मेदारी है।

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