दिलचस्प पोस्ट
क्यों malloc + मेकसेट कॉलोक की तुलना में धीमी है? ब्राउज़र के माध्यम से कैमरा पहुंच डेटा को मानकीकृत करने के लिए यह कोड कैसे काम करता है? क्या मैं jQuery के द्वारा स्क्रिप्ट टैग बना सकता हूं? कौन सा एक का उपयोग करने के लिए, पूर्णांक या पूर्णांक स्विफ्ट – MKMapView को MKAnnotationView जोड़ें किस मामले में `जीआईटी पुल 'हानिकारक हो सकता है? Android एमुलेटर में ब्लूटूथ का उपयोग कैसे करें? मैं तालिका में सह-घटना की गणना कैसे करूं? एंड्रॉइड ब्राउज़र से कस्टम एंड्रॉइड एप्लिकेशन लॉन्च करें PEM BASE64 एन्कोडेड निजी कुंजी फ़ाइल से आरएसए निजी कुंजी प्राप्त करना मुझे एक टंकिनर आवेदन में मुख्य लूप को कैसे कॉल करना पड़ता है? अमूर्त वर्ग या इंटरफ़ेस का उपयोग कब किया जाए? ग्रहण त्रुटियां बंद करें (जो वास्तव में त्रुटियां नहीं हैं) फ़ायरफ़ॉक्स एक्सटेंशन कस्टम फोंट

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

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

Solutions Collecting From Web of "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 = ?" 

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