आपको कभी भी ResultSet
pass पास नहीं करना चाहिए सार्वजनिक तरीकों के माध्यम से चारों ओर। यह संसाधन लीक होने की संभावना है क्योंकि आपको कथन और कनेक्शन को खुला रखने के लिए मजबूर किया जाता है। उन्हें बंद करने से परिणाम सेट परोक्ष रूप से बंद हो जाएगा। लेकिन उन्हें खुला रखने से वे इधर-उधर लटक जाते हैं और डीबी संसाधनों से बाहर हो जाते हैं जब उनमें से बहुत सारे खुले होते हैं।
इसे इस तरह Javabeans के संग्रह में मैप करें और इसके बजाय इसे वापस करें:
public List<Biler> list() throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
List<Biler> bilers = new ArrayList<Biler>();
try {
connection = database.getConnection();
statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
resultSet = statement.executeQuery();
while (resultSet.next()) {
Biler biler = new Biler();
biler.setId(resultSet.getLong("id"));
biler.setName(resultSet.getString("name"));
biler.setValue(resultSet.getInt("value"));
bilers.add(biler);
}
} finally {
if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}
return bilers;
}
या, यदि आप पहले से ही जावा 7 पर हैं, तो बस का उपयोग करें। संसाधनों के साथ प्रयास करें बयान जो उन संसाधनों को स्वतः बंद कर देगा:
public List<Biler> list() throws SQLException {
List<Biler> bilers = new ArrayList<Biler>();
try (
Connection connection = database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler");
ResultSet resultSet = statement.executeQuery();
) {
while (resultSet.next()) {
Biler biler = new Biler();
biler.setId(resultSet.getLong("id"));
biler.setName(resultSet.getString("name"));
biler.setValue(resultSet.getInt("value"));
bilers.add(biler);
}
}
return bilers;
}
वैसे, आपको Connection
. घोषित नहीं करना चाहिए , Statement
और ResultSet
उदाहरण चर के रूप में (प्रमुख थ्रेडसेफ्टी समस्या!), और न ही SQLException
निगलना चाहिए उस बिंदु पर (कॉल करने वाले को कोई सुराग नहीं होगा कि कोई समस्या हुई है), और न ही उसी try
में संसाधनों को बंद करना होगा (यदि उदाहरण के लिए परिणाम सेट एक अपवाद फेंकता है, तो कथन और कनेक्शन अभी भी खुले हैं)। उन सभी मुद्दों को उपरोक्त कोड स्निपेट में ठीक किया गया है।