2012-11-25 14 views
14

में डेटास्रोत इंजेक्शन जब आप अपने आवेदन में डेटास्रोत इंजेक्ट करते हैं और उस पर getConnection() का आह्वान करके कनेक्शन प्राप्त करते हैं, तो क्या आप कनेक्शन बंद करना चाहते हैं?ईजेबी

+2

हाँ आप कनेक्शन जो कनेक्शन वापस पूल करने के लिए जारी करेंगे बंद करने के लिए की जरूरत है। – dinukadev

+0

आप getConnection का उपयोग क्यों करना चाहते हैं और PersistenceContext को इंजेक्शन नहीं दे रहे हैं? – perissf

उत्तर

17

हालांकि डेटा स्रोत ही कंटेनर में कामयाब रहे है, एपीआई वास्तव में कनेक्शन बंद करने के लिए प्रोग्रामर की आवश्यकता है। यह कुछ अन्य कंटेनर प्रबंधित संसाधनों (इकाई प्रबंधक की तरह) से अलग है, जहां कंटेनर बंद होने का ख्याल रखता है। ध्यान दें कि अधिकांश मामलों में यहां बंद होने पर वास्तव में कनेक्शन बंद कर देता है, लेकिन कनेक्शन पूल से कनेक्शन लौटाता है।

अंगूठे के नियम के रूप में, यदि आप एक या अधिक संसाधनों को बंद करने के लिए कारखाने-ईश संसाधनों का उपयोग बंद कर सकते हैं, तो आपको उन्हें बंद करना होगा। अन्यथा कंटेनर यह करता है।

Connection औजार के बाद से AutoCloseable, तो आप इस के लिए एक कोशिश के साथ-संसाधनों ब्लॉक का उपयोग कर सकते हैं:

@Stateless 
public class MyBean { 

    @Resource(lookup = "java:/app/datasource") 
    private DataSource dataSource; 

    public void doStuff() { 
     try (Connection connection = dataSource.getConnection()) { 

      // Work with connection here 

     } catch (SQLException e) { 
      throw new SomeRuntimeException(e); 
     } 
    } 
} 
5

बेशक, अन्यथा आप अपने कनेक्शन पूल को समाप्त कर देंगे। यह अंत में ब्लॉक में यह करने के लिए सबसे अच्छा है:

@Resource(mappedName="jndi/yourDatasource") 
DataSource ds; 

.. 

Connection conn = null; 
try { 
    conn = ds.getConnection(); 
    //PERFORM QUERY, ETC.. 
} 
catch(SQLException ex) { 
    //EXCEPTION HANDLING 
} 
finally { 
    try { 
     if(conn != null) 
      conn.close(); 
    } 
    catch(SQLException ex) {..} 
} 
संबंधित मुद्दे