安全返回結果集
由於資源洩漏的風險,從資料庫查詢傳回結果集可能是一項複雜的任務。在這裡,我們透過探索一種有效返回資料的替代方法來解決這項挑戰。
問題:
當嘗試直接傳回結果集時,程式碼會拋出由於方法執行後結果集關閉而引發 java.sql.SQLException。
解決方案:對應到JavaBeans
不是傳回結果集本身,而是將資料對應到 JavaBean 集合。這種方法可讓您在迭代結果集時保持連接和語句開啟。以下是範例:
public List<Biler> list() throws SQLException { Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; List<Biler> bilers = new ArrayList<>(); 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; }
Try-with-Resources 語句
如果您使用的是 Java 7 或更高版本,則可以使用try-with-resources自動資源關閉的語句:
public List<Biler> list() throws SQLException { List<Biler> bilers = new ArrayList<>(); 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; }
附加註意事項
避免將連線、語句和結果集宣告為實例變數(執行緒安全問題)很重要。此外,正確處理 SQLException 並以正確的順序關閉資源也至關重要。遵循這些準則,您可以有效地傳回結果集,同時保持資源管理。
以上是Java如何安全地傳回資料庫結果集並避免資源外洩?的詳細內容。更多資訊請關注PHP中文網其他相關文章!