2009-09-22 11 views
25

का उपयोग कर पूलिंग मेरी सहायक वर्ग डीबी कनेक्शन लेने के लिए है।JDBC कनेक्शन के बाद C3P0

public class DBConnection { 

    private static DataSource dataSource; 
    private static final String DRIVER_NAME; 
    private static final String URL; 
    private static final String UNAME; 
    private static final String PWD; 

    static { 

     final ResourceBundle config = ResourceBundle 
       .getBundle("props.database"); 
     DRIVER_NAME = config.getString("driverName"); 
     URL = config.getString("url"); 
     UNAME = config.getString("uname"); 
     PWD = config.getString("pwd"); 

     dataSource = setupDataSource(); 
    } 

    public static Connection getOracleConnection() throws SQLException { 
     return dataSource.getConnection(); 
    } 

    private static DataSource setupDataSource() { 
     ComboPooledDataSource cpds = new ComboPooledDataSource(); 
     try { 
      cpds.setDriverClass(DRIVER_NAME); 
     } catch (PropertyVetoException e) { 
      e.printStackTrace(); 
     } 
     cpds.setJdbcUrl(URL); 
     cpds.setUser(UNAME); 
     cpds.setPassword(PWD); 
     cpds.setMinPoolSize(5); 
     cpds.setAcquireIncrement(5); 
     cpds.setMaxPoolSize(20); 
     return cpds; 
    } 
} 
डीएओ में

मैं कुछ इस तरह लिख कर दिया जाएगा: अब

try { 
      conn = DBConnection.getOracleConnection(); 

      .... 


} finally { 
    try { 
     if (rs != null) { 
      rs.close(); 
     } 
     if (ps != null) { 
      ps.close(); 
     } 
     if (conn != null) { 
      conn.close(); 
     } 
    } catch (SQLException e) { 
     logger 
       .logError("Exception occured while closing cursors!", e); 

    } 

, मेरे सवाल का मैं कर्सर को बंद करने (की तुलना में किसी अन्य को साफ करने के लिए अन्य परेशान है कनेक्शन/बयान/परिणामसेट/तैयार स्थिति) अंत में ब्लॉक में सूचीबद्ध है।

this सफाई क्या है ?? मुझे कब और कहाँ करना चाहिए?

क्या आपको उपरोक्त कोड में कुछ भी गलत लगता है, कृपया बताएं।

+0

जेडीके 7 में आपको तैयार स्टेटमेंट को बंद करने की आवश्यकता नहीं है, यह ऑटोक्लोसेबल लागू करता है। [इस पोस्ट के कारण] (http://stackoverflow.com/questions/14862853/resource-leak-warning-in-eclipse) –

उत्तर

20

पूल किए गए डेटा स्रोत के साथ, पूल में कनेक्शन वास्तव में बंद नहीं होते हैं, वे बस पूल में वापस आते हैं। हालांकि, जब एप्लिकेशन बंद हो जाता है, तो डेटाबेस से उन कनेक्शनों को ठीक से और वास्तव में बंद किया जाना चाहिए, जहां अंतिम सफाई आती है।

संयोग से, c3p0 प्रोजेक्ट पानी में काफी मर चुका है, मैं आपको सलाह देता हूं इसके बजाय Apache Commons DBCP का उपयोग करें, यह अभी भी बनाए रखा जा रहा है।

+7

@ स्काफमैन: मैं डीबीसीपी से सी 3 पी 0 तक स्विच करने वाला था, इसके विपरीत लगभग पढ़ने के बाद आपने यहां कहा है: http://stackoverflow.com/questions/520585/connection-pooling- विकल्प-with-jdbc-dbcp-vs-c3p0। अब मुझे इतना यकीन नहीं है - ऐसा लगता है कि न तो प्रोजेक्ट में हाल ही में टीएलसी है। – Adamski

+0

@Adamski: मैं आपको सुनता हूँ। बाजार में असीमित अंतर। – skaffman

+2

बोनसीपी, बहुत सक्रिय, उत्कृष्ट उपकरण, अच्छा प्रलेखन, बहुत तेज़ उपयोग करें। हम इसे बहुत अधिक यातायात साइट पर उपयोग करते हैं और इसमें कोई समस्या नहीं है। – Janning

3

कोड मुझे ठीक लग रहा है, लेकिन मैं एक सहायक विधि लिखूंगा जो करीबी परिचालन करता है या आपको प्रत्येक डीएओ या विधि में अंततः यह वर्बोज़ मिल जाएगा। शायद आपको बंद संचालन के आस-पास तीन अलग-अलग प्रयास-पकड़-ब्लॉक लिखना चाहिए, ताकि यह सुनिश्चित किया जा सके कि कनेक्शन बंद हो गया है, भले ही कथन और परिणामसेट ने एक निष्कर्ष निकाला हो। यह भी ध्यान रखें कि javadoc says

जब एक वक्तव्य वस्तु बंद है, इसकी वर्तमान ResultSet वस्तु, यदि कोई है, यह भी बंद कर दिया है।

तो आपको उपरोक्त उदाहरण में परिणामसेट को बंद करने की आवश्यकता नहीं है, लेकिन आप कर सकते हैं।

कनेक्टेड क्लीनअप विधि डाटासोर्स को बंद करने के लिए है, अधिकांश परियोजनाओं में इसकी आवश्यकता नहीं है क्योंकि डीएस तब तक रहता है जब तक आपका ऐप चल रहा हो।

5

डीएओ डेटाबेस से कनेक्शन प्राप्त करने के लिए ज़िम्मेदार नहीं होना चाहिए। उनके पास यह जानने का कोई तरीका नहीं है कि उन्हें बड़े लेनदेन के हिस्से के रूप में उपयोग किया जा रहा है। आपको डीएओ में डेटा स्रोत या कनेक्शन इंस्टेंस पास करना चाहिए।

यदि आपके आखिरकार ब्लॉक में बंद करने के लिए कोई भी कॉल अपवाद फेंक देता है, तो अनुसरण करने वाले किसी भी व्यक्ति को नहीं कहा जाएगा। प्रत्येक को अपने स्वयं के प्रयास/पकड़ ब्लॉक में होना चाहिए। मैंने उन्हें एक उपयोगिता वर्ग में स्थैतिक तरीकों के रूप में रखा।

0

मैं प्ले फ्रेमवर्क और स्कैला का उपयोग करता हूं, इसलिए निम्न उदाहरण प्ले प्रोजेक्ट में है।

चरण 1। कॉन्फ़िगरेशन

build.sbt में, यदि आप डेटाबेस के रूप में mysql/hive का उपयोग करते हैं, तो आपको इन गुणों को जोड़ने की आवश्यकता है।

libraryDependencies ++ = Seq (
    jdbc, 
    "mysql" % "mysql-connector-java" % "5.1.31", 
    "org.apache.hive" % "hive-jdbc" % "0.12.0", 
    "com.mchange" % "c3p0" % "0.9.2.1" 
) 

चरण 2। इसे कैसे पहुंचाया जाए? आपको c3p0 लाइब्रेरी आयात करने की आवश्यकता है।

import com.mchange.v2.c3p0.ComboPooledDataSource 

चरण 3। और फिर आपको उदाहरण बनाने की आवश्यकता है।

val cpds = new ComboPooledDataSource() 
cpds.setDriverClass(...) 
cpds.setJdbcUrl(...) 
cpds.setUser(...) 
cpds.setPassword(...) 

चरण 4। आपको एक कनेक्शन

cpds.getConnection