दिलचस्प पोस्ट
"मल्टीकोर" असेंबली भाषा क्या दिखती है? पायथन उपप्रोसेन। पोपेन "ओएसईआरआर: मेमोरी आवंटित नहीं की जा सकती" पायथन – उद्धरण अंकों के अंदर उद्धरण चिह्नों का उपयोग करना आप मूल्य से एक शब्दकोश कैसे सॉर्ट करते हैं? हुवाई, लॉगअप मेरे ऐप के लिए लॉग नहीं दिखा रहा है? SQL डेटाबेस में यूटीएफ -8 स्ट्रिंग क्लासिक एएसपी परिवर्तित करें jQuery में सहारा () और एट्रि () के बीच अंतर और जब attr () और prop () का उपयोग करने के लिए) अधिकतम सरणी लंबाई कोटा फ़ाइल से आरएसए सार्वजनिक कुंजी लोड करें अपने नंबर में एक्सेल कॉलम पत्र को बदलने के लिए एल्गोरिथ्म क्या है? JSF 1.2 से JSF 2.0 में माइग्रेट करना MVC में मानक डेटाटैबल्स प्रदर्शित करना एक ओपनएमपी समानांतर कोड में, समानांतर में चलाने के लिए मैमसेट का कोई फायदा होगा? केवल पैरामीटरलेस कन्स्ट्रक्टर और प्रारंभकर्ता LINQ को इकाई में समर्थित हैं Std :: cin से बाइनरी डेटा पढ़ें

JDBC में कितनी बार कनेक्शन, वक्तव्य और परिणाम बंद होना चाहिए?

क्या प्रत्येक क्वेरी के बाद उन्हें बंद करने की आवश्यकता है और प्रत्येक क्वेरी की शुरुआत में आरम्भ किया गया है?

वेब के समाधान से एकत्रित समाधान "JDBC में कितनी बार कनेक्शन, वक्तव्य और परिणाम बंद होना चाहिए?"

हमेशा संसाधन लीक, ट्रांसेक्शनल समस्याएं और थका हुआ कनेक्शन पूल से बचने के लिए आपको कम से कम संभव क्षेत्र में उन्हें प्राप्त करना और बंद करना होगा। ऐसा नहीं करने से डीबी को जल्द ही या बाद में संसाधनों से बाहर निकलने का कारण होगा, जिसके परिणामस्वरूप "बहुत सारे कनेक्शन" जैसे अपवाद उत्पन्न होंगे

सामान्य जेडीबीसी मुहावरे निम्न हैं, जिससे सभी संसाधन खुले और बंद किए जाते हैं, साथ-साथ संसाधन-संसाधन ब्लॉक में भी:

public List<Entity> list() throws SQLException { List<Entity> entities = new ArrayList<Entity>(); try ( Connection connection = database.getConnection(); PreparedStatement statement = connection.prepareStatement(SQL_LIST); ResultSet resultSet = statement.executeQuery(); ) { while (resultSet.next()) { entities.add(map(resultSet)); } } return entities; } 

या जब आप अभी तक जावा 7 पर नहीं हैं:

 public List<Entity> list() throws SQLException { List<Entity> entities = new ArrayList<Entity>(); Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; try { connection = database.getConnection(); statement = connection.prepareStatement(SQL_LIST); resultSet = statement.executeQuery(); while (resultSet.next()) { entities.add(map(resultSet)); } } finally { if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {} if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {} if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {} } return entities; } 

PreparedStatement का प्रयोग आपको बयान के डीबी कैशिंग का लाभ देगा (ठीक से उपयोग किए जाने पर एसक्यूएल इंजेक्शन की रोकथाम के आगे)। कनेक्शन प्राप्त करना और बंद करना सबसे महंगी कार्य है, लेकिन वहां कनेक्शन पूल का आविष्कार किया जाता है। यदि आप बल्क आवेषण / अपडेट करने के लिए एक ही कथन का पुन: उपयोग करना चाहते हैं, तो आप बैचों का उपयोग कर सकते हैं।

यह भी देखें:

  • जब मेरा ऐप कनेक्शन खो देता है, तो मुझे इसे कैसे ठीक करना चाहिए?
  • क्या यह एक स्थैतिक java.sql.Connection उदाहरण को एक multithreaded सिस्टम में उपयोग करने के लिए सुरक्षित है?

चूंकि आप किसी पिछली क्वेरी के परिणाम नहीं चाहते हैं, इसलिए आपको निश्चित रूप से ResultSet को इनिशियलाइज़ करना होगा।

वक्तव्य को फिर से रखा जा सकता है, यदि आवश्यक हो तो फिर से, और विशेष रूप से तैयार किए गए अवस्थापनों को रखा जाना चाहिए – उन्हें डेटाबेस द्वारा पहले रन पर पूर्व-कंपाइल किया जा सकता है, जो कुछ सेकंड बचाता है:

 "SELECT foo FROM bar WHERE a = ?" 

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