2013-03-13 6 views
10

मेरे पास एक जावा प्रोग्राम है जिसमें मैं चुनिंदा प्रश्नों के लिए कुछ जेडीबीसी कर रहा हूं। क्या प्रत्येक बार testDataBase() को कॉल करने की सलाह दी जाएगी जो प्रत्येक बार DBConnection() को कॉल करता है या मुझे सभी प्रश्नों के लिए एक कनेक्शन का पुन: उपयोग करना चाहिए। अग्रिम में धन्यवाद।जावा जेडीबीसी कनेक्शन का पुन: उपयोग

private void testDataBase(String query){Connection con = DBConnection(); 
    Statement st = null; 
    ResultSet rs = null; 

    try { 
     st = con.createStatement(); 
     rs = st.executeQuery(query); 
     boolean flag = true; 
     while (rs.next()) { 
      String resultString = ""; 
      for(int i = 1; i <=rs.getMetaData().getColumnCount();i++){ 
       resultString=resultString+" "+ rs.getString(i); 
      } 
      System.out.println(resultString); 
     } 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 

} finally { 
    if (st != null) { 
     try { 
      st.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
    } 
    } 
    if (rs != null) { 
     try { 
      rs.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
    if (con != null) { 
     try { 
      con.close(); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

}    



private Connection DBConnection() { 
    final String method_name = "DBConnection"; 
    Connection conn = null; 
    try{ 
     Class.forName(driver).newInstance(); 
     conn = java.sql.DriverManager.getConnection(url,userName,password); 

     }catch (ClassNotFoundException e) { 
     System.out.println(e.getMessage()); 
    } catch (SQLException e) { 
     System.out.println(e.getMessage()); 
    } catch (InstantiationException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } 

    return conn; 

} 
+0

आप एक परिदृश्य से संबंधित प्रश्नों के लिए एक कनेक्शन का उपयोग करना चाहिए। उदाहरण, एक नया उपयोगकर्ता बनाना। फिर कनेक्शन खोलें, (1) जांचें कि क्या नया उपयोगकर्ता आईडी पहले से मौजूद है, फिर (2) user_table में डालें। दोनों प्रश्न एकल कनेक्शन का उपयोग करके किया जाना चाहिए। – asifsid88

+0

हाँ आप उसी कनेक्शन का पुन: उपयोग कर सकते हैं –

+0

सिंगलटन का उपयोग करें .. –

उत्तर

10

डीबी कनेक्शन खोलना perfofmance के मामले में एक महंगा संचालन है। विभिन्न अनुरोधों के बीच कनेक्शन साझा करने के लिए आपको कनेक्शन कनेक्शन का उपयोग करना चाहिए।

5

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

4

डेटाबेस कनेक्शन प्राप्त करना काफी महंगा ऑपरेशन है, इसलिए यदि संभव हो तो कनेक्शन का दोबारा उपयोग करने की सलाह दी जाती है। कनेक्शन पूलिंग का उपयोग करने पर भी विचार करें, जो आपके लिए कई कनेक्शन बनाए रखेगा, ताकि आप आवश्यकता होने पर पूल से केवल एक को पकड़ सकें। ऊपर दिखाए गए तरीके को बदलने की आवश्यकता नहीं है, यह आपके द्वारा कॉल की गई DBConnection() विधि पर निर्भर करता है।

1

प्रदर्शन के संदर्भ में मैं पूरी तरह से @ एमीर कोस्ट से सहमत हूं, जो आप कर सकते हैं सबसे धीमे ऑपरेशन में डीबी कनेक्शन खोलना, और यदि आपके पास वास्तविक वास्तविक समय की बाधाएं हैं तो यह एक बड़ा मुद्दा हो सकता है। मुझे नहीं पता कि आप ढांचे का उपयोग कर रहे हैं या नहीं, लेकिन एक अच्छा अभ्यास एक बीन प्रकाशित करना है जो कनेक्शन के पूल को लपेटता है और हर बार जब आपको सीधे डीबी के साथ बातचीत करने की आवश्यकता होती है, तो आपको वर्तमान खुला कनेक्शन मिलता है (जो आमतौर पर एक तथाकथित "सत्र" के अनुरूप होता है)। इस तकनीकीता को पुन: पेश करने के लिए मैं आपको सलाह देता हूं, (भले ही आप किसी भी ढांचे का उपयोग नहीं कर रहे हों)।

4

कनेक्शन थ्रेड सुरक्षित नहीं हैं, इसलिए अनुरोधों में उन्हें साझा करना एक अच्छा विचार नहीं है।

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

-1

आप कनेक्शन उसमें केवल एक ही चाहते हैं तो आपको सिंगलटन पैटर्न का उपयोग कर सकते हैं, तो आप पर विचार कर सकते हैं:

public class Connector { 

private static final String URL = "jdbc:mysql://localhost/"; 
private static final String LOGIN = "root"; 
private static final String PASSWORD = "azerty"; 
private static final String DBNAME = "videotheque"; 
private static Connector connector; 
private static Connection connection; 

private Connector() { 
} 

public synchronized static Connector getInstance() { 
    if (connector == null) { 
     connector = new Connector(); 
    } 
    return connector; 
} 

public static Connection getConnection() { 
    if (connection == null) { 
     Connection c = null; 
     try { 
      Class.forName("com.mysql.jdbc.Driver"); 
     } catch (ClassNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     try { 
      c = DriverManager.getConnection(URL + DBNAME, LOGIN, PASSWORD); 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return c; 
    } 
    return connection; 
} 

}

और फिर, आप कॉल कर सकते हैं: Connector.getInstance().getConnection()

+0

यह प्रदर्शन के मामले में कुछ भी नहीं बदलता है। आपके उदाहरण में आप अभी भी DriverManager.getConnection विधि को हर बार आमंत्रित करते हैं। – ANTARA

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