ध्यान दें कि आप कॉल कर रहे हैं .getConnection()
कई बार। हालांकि इस मोर्चे पर दस्तावेज़ीकरण स्पष्ट हो सकता है DataSource.getConnection()
वास्तव में खुलता है एक नया कनेक्शन (मौजूदा कनेक्शन वापस करने के विपरीत) इस प्रकार आपको उस विधि से लौटाए गए प्रत्येक इंस्टेंस को बंद करने की आवश्यकता है।
.getConnection()
. के रूप में हर बार एक नया इंस्टेंस बनाता है जब इसे कहा जाता है कि यह लाइन कनेक्शन लीक है, क्योंकि यह कनेक्शन को वापस नहीं कर रहा है:
pstmt = dataSource.getConnection().prepareStatement(query);
और यह लाइन केवल तुरंत बंद करने के लिए एक नया कनेक्शन बेकार ढंग से खोलती है:
dataSource.getConnection().close();
ऐसा लगता है कि आप isValidUser()
के प्रत्येक आह्वान के लिए एक अलग कनेक्शन खोलने और बंद करने का प्रयास कर रहे हैं (चूंकि आप उस विधि कॉल के अंत में कनेक्शन बंद कर रहे हैं)। यहां तक कि अगर आप ऊपर वर्णित रिसाव को ठीक करते हैं, तो भी कनेक्शन का उपयोग करने का इरादा नहीं है। इसके बजाय आपको अपने आवेदन में एक कनेक्शन (या उनमें से एक छोटी संख्या) साझा करना चाहिए। तो जब आपका प्रोग्राम शुरू होता है तो आप ऐसा कनेक्शन खोलते हैं, और एक बार पूरा प्रोग्राम अब कनेक्शन की आवश्यकता नहीं है (अक्सर समाप्त होने से कुछ समय पहले) आप इसे बंद कर देते हैं।
इस तरह का व्यवहार आमतौर पर निर्भरता इंजेक्शन द्वारा कार्यान्वित किया जाता है। , जहां आप अपने कनेक्शन और अन्य संसाधनों का निर्माण करते हैं और फिर उन्हें उन वस्तुओं में पास करते हैं जिनकी उन्हें आवश्यकता होती है - यह उन संसाधनों का उपयोग करने वाले कोड से संसाधन प्रबंधन को अलग करता है। एक सरल उदाहरण के रूप में:
public static void main(String[] args) {
DataSource dataSource = createDataSource();
try (Connection connection = dataSource.getConnection()) {
runProgram(connection);
}
}
/**
* this method doesn't need to worry about closing the Connection,
* it trusts that its caller will be responsible for that.
*/
private static void runProgram(Connection connection) {
// ...
}
अंगूठे के एक नियम के रूप में, वस्तुओं को केवल उनके द्वारा निर्मित वस्तुओं को बंद करने के लिए जिम्मेदार होना चाहिए, और उन वस्तुओं को बंद करने से बचना चाहिए जिन्हें वे पारित कर चुके हैं। आपके वर्तमान कोड में UserDaoImpl
कनेक्शन खोल रहा है, इसलिए इसे बंद करने के लिए जिम्मेदार होना चाहिए, लेकिन मैं Connection
में पास करने का सुझाव दे रहा हूं इसके बजाय।