安全返回结果集
由于存在资源泄漏的风险,从数据库查询返回结果集可能是一项复杂的任务。在这里,我们通过探索一种有效返回数据的替代方法来解决这一挑战。
问题:
当尝试直接返回结果集时,代码会抛出由于方法执行后结果集被关闭而引发 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中文网其他相关文章!