2011-05-29 19 views
6

मैं कक्षा बनाने वाला हूं जो डेटाबेस पर काम करेगा। कक्षा में addRecord(), getAllRecords(), इस तरह की सामग्री होगी। मैं कक्षा को डिजाइन करने के लिए एक अच्छा दृष्टिकोण तलाश रहा हूं। क्या मुझे यह करना होगा: 1) प्रत्येक फ़ंक्शन के लिए नया कनेक्शन बनाएं। इस तरह:जेडीबीसी बेस्ट प्रैक्टिस

void readRecords(){ 
    try { 
     Connection con = DriverManager.getConnection (connectionURL); 

     Statement stmt = con.createStatement(); 

     ResultSet rs = stmd.executeQuery("select moviename, releasedate from movies"); 

     while (rs.next()) 
      System.out.println("Name= " + rs.getString("moviename") + " Date= " + rs.getString("releasedate"); 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    catch (Exception e) { 
     e.printStackTrace(); 
    } 
    finally { 
     con.close(); 
    } 
} 

या

2) यह एक सदस्य चर

class MyClass{ 
    private Connection con; 

    public MyClass(){ 
      con = DriverManager.getConnection (connectionURL); 
    } 
} 

के रूप में एक कनेक्शन है और हर कार्य के लिए सिर्फ बयान बनाने के लिए बेहतर है।

3) या कुछ और ...

उत्तर

6

अगर वहाँ लगातार नियमित रूप से JDBC कॉल कर रहे हैं, तो एक डेटाबेस connection pool का उपयोग करें।

3

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

आप टोमकैट या अपाचे कनेक्शन पूलिंग क्लासेस का उपयोग कर सकते हैं। इस वर्ग को पैकेज में उदाहरण के लिए परिभाषित किया गया है

org.apache.commons.dbcp। *;

org.apache.tomcat.dbcp.dbcp। *;

जहां डीबीसीपी डेटाबेस कनेक्शन पूलिंग के लिए खड़ा है।

11

दोनों दृष्टिकोण खराब हैं। पहला व्यक्ति आपको उचित लेनदेन प्रबंधन को लागू करने की अनुमति नहीं देगा, क्योंकि आप उसी लेनदेन के अंदर कई विधियों को कॉल नहीं कर सकते हैं। बाद वाले व्यक्ति को कई वस्तुओं की अनावश्यक रचना की आवश्यकता होती है।

सबसे अच्छा तरीका वर्तमान कनेक्शन की धारणा पेश करना होगा, जिसे किसी प्रकार के लेनदेन संबंधी संदर्भ से प्राप्त किया जा सकता है। असल में, यह इस तरह दिखना चाहिए:

beginTransaction(...); // Opens connection and starts transaction 

readRecords(...); // Uses the current connection 
addRecord(...); 
... 

commitTransaction(...); // Commits transaction and closes connection 

simpliest लेकिन बहुत ही सुंदर नहीं कार्यान्वयन बुला विधि के अंदर एक Connection खोलने के लिए है (जो लेन-देन की सीमाओं को परिभाषित करता है) और यह एक पैरामीटर के रूप में अपने तरीकों के गुजरती हैं।

अधिक परिष्कृत समाधान वर्तमान Connection के लिए static ThreadLocal संग्रहण बनाने के लिए है, जब आप एक लेनदेन शुरू करते हैं और इसे अपने तरीकों के अंदर उस भंडारण से प्राप्त करते हैं तो उसे वहां रखें। कुछ ढांचे इस दृष्टिकोण को लागू करते हैं, उदाहरण के लिए, Spring Framework

ध्यान दें कि कनेक्शन पूलिंग इन मामलों के लिए पूरी तरह से ऑर्थोगोनल है।

+0

+1 मैं वास्तव में अच्छा soln ... वास्तव में हम इसे कई स्थानों पर उपयोग कर रहे हैं ... लेकिन शायद ओपी के लिए overkill ... लेकिन फिर भी व्यवहार्य –

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