在Connection上调用close方法会关闭Statement和ResultSet吗?
级联的关闭这听起来好像很有道理,而且在很多地方这样做也是正确的,通常这样写
Connection con = getConnection();//getConnection is your method
PreparedStatement ps = con.prepareStatement(sql);
ResultSet rs = ps.executeQuery();
……
///rs.close();
///ps.close();
con.close(); // NO!
这
样做的问题在于Connection是个接口,它的close实现可能是多种多样的。在普通情况下,你用
DriverManager.getConnection()得到一个Connection实例,调用它的close方法会关闭Statement和
ResultSet。但是在很多时候,你需要使用数据库连接池,在连接池中的得到的Connection上调用close方法的时候,Connection可能并没有被释放,而是回到了连接池中。它以后可能被其它代码取出来用。如果没有释放Statement和ResultSet,那么在Connection上没有关闭的Statement和ResultSet可能会越来越多,那么……
相反,我看到过这样的说法,有人把Connection关闭了,却继续使用ResultSet,认为这样是可以的,引发了激烈的讨论,到底是怎么回事就不用我多说了吧。
所以我们必须很小心的释放数据库资源,下面的代码片断展示了这个过程
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
con = getConnection();//getConnection is your method
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
///...........
}
catch (SQLException ex) {
///错误处理
}
finally{
try {
if(ps!=null)
ps.close();
}
catch (SQLException ex) {
///错误处理
}
try{
if(con!=null)
con.close();
}
catch (SQLException ex) {
///错误处理
}
}
很麻烦是不是?但为了写出健壮的程序,这些处理是必须的。
上面这东西讲得真是精辟。
分享到:
相关推荐
9. 非滚动与滚动ResultSet:非滚动ResultSet只能按顺序读取,而滚动ResultSet允许向前和向后导航,甚至可以在不关闭ResultSet的情况下跳过行。 10. 更新ResultSet:如果ResultSet是可更新的,你可以使用updateXXX()...
在这个改进后的版本中,当离开try块时,所有的AutoCloseable对象(包括Connection、Statement和ResultSet)都会自动关闭,无论是否抛出异常,从而避免了资源泄露的问题。 此外,还可以考虑使用PreparedStatement和...
- 错误处理和资源管理,如关闭数据库连接和流 总的来说,这个项目提供了一个便捷的方式来将数据库查询结果批量导出为Excel格式,对于需要处理大量数据并进行分析的场景非常实用。用户可以学习这个项目的源码,理解...
默认情况下,`ResultSet`关闭时,未提交的事务可能会被回滚。确保正确管理和提交事务以保持数据一致性。 6. `ResultSet`的类型: 有三种类型的`ResultSet`,它们定义了结果集的滚动行为: - `TYPE_FORWARD_ONLY`:...
总结来说,从Java存储过程返回JDBC ResultSet作为REF CURSOR,主要是为了解决Oracle数据库的特性和JDBC的兼容问题。通过Oracle9i引入的特性,开发者可以利用这种方法在PL/SQL和Java之间更灵活地交换数据。然而,这种...
本篇笔记将深入探讨2010年6月23日记录的一些关于ResultSet的常用操作,结合实例进行讲解。 1. 创建与初始化 在Java中,我们通常通过Statement或PreparedStatement对象的executeQuery()方法执行SQL查询来获取...
标题和描述均聚焦于解释Java Database Connectivity (JDBC)中三个核心接口——`Connection`、`Statement`和`ResultSet`的作用。这三个接口是JDBC API的核心组成部分,它们共同协作,使得Java应用程序能够与各种关系...
- 使用`ResultSet`时要注意资源管理,使用完后要关闭以释放数据库连接和内存资源,防止资源泄漏。 - 对于可更新的结果集,务必在执行更新操作后调用`updateRow()`来将更改保存到数据库。 掌握这些`ResultSet`的...
关闭不再使用的ResultSet可以释放资源,提高系统性能。在P6Spy中,可以通过配置来控制对ResultSet的处理,例如设置合适的fetch size,或者在操作完成后立即关闭。 **加入每日归档** "加入每日归档"涉及的是数据库的...
在实际的应用程序中,可以调用`DbClose.java`中的这些方法来确保资源被正确关闭,避免内存泄漏等问题。例如,在执行完查询后,可以这样关闭资源: ```java ResultSet rs = null; Statement stmt = null; Connection ...
6. **关闭资源**:最后关闭Statement、ResultSet和Connection对象。 **1.4 QuickStart示例** 示例代码展示了如何使用JDBC连接数据库并执行查询操作: ```java // 加载MySQL数据库驱动 Class.forName(...
在Java中,我们可以使用try-with-resources语句,它会自动关闭在try块中声明的实现了AutoCloseable接口的对象,例如Connection、Statement和ResultSet。 下面是一个示例,展示了如何正确关闭数据库连接: ```java ...
解决这个问题需要对ResultSet的使用进行审查,确保正确处理数据和关闭资源,同时检查SQL查询和数据库连接设置。在JSP环境中,还需要考虑页面生命周期和与后台数据库交互的逻辑。通过这些步骤,通常可以找出并修复...
HikariCP-java7-2.4.10.jar 光连接池 传说光一样的速度.
在实际应用中,为了提高代码的可维护性和安全性,应使用PreparedStatement防止SQL注入,同时注意关闭数据库连接、Statement和ResultSet等资源。此外,还可以考虑使用Connection池管理数据库连接,提高应用程序的性能...
本篇将详细介绍如何使用CallableStatement调用Oracle存储过程,并处理返回的结果集(ResultSet)。 一、无返回值的存储过程 在Oracle中,一个无返回值的存储过程可能只执行某些操作,例如插入数据。以下是一个简单...
在Java编程中,CallableStatement接口是用来执行SQL存储过程或函数的。在Oracle数据库中,存储过程可以接收输入参数、输出参数或两者...对于返回结果集的存储过程,可以利用ResultSet遍历每一行数据,获取所需的信息。
2. **资源关闭顺序**:建议先关闭`ResultSet`,然后关闭`PreparedStatement`,最后关闭`Connection`。这是因为`PreparedStatement`和`Connection`的关闭操作可能会关闭它们所持有的资源。 3. **异常处理**:在关闭...
最后,为了释放系统资源,必须按照顺序关闭`ResultSet`、`Statement`和`Connection`,以避免内存泄漏。 实验结果包括了创建数据库、建表、插入数据、配置ODBC数据源以及在MyEclipse环境中成功连接到数据库。实验...