`
vencent
  • 浏览: 33848 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关于ResultSet的关闭问题

SQL 
阅读更多

在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) {
        ///错误处理
    }
}

很麻烦是不是?但为了写出健壮的程序,这些处理是必须的。



上面这东西讲得真是精辟。


Vencent Chen 2006-03-15 23:15 发表评论
分享到:
评论

相关推荐

    ResultSet

    9. 非滚动与滚动ResultSet:非滚动ResultSet只能按顺序读取,而滚动ResultSet允许向前和向后导航,甚至可以在不关闭ResultSet的情况下跳过行。 10. 更新ResultSet:如果ResultSet是可更新的,你可以使用updateXXX()...

    怎样实现关闭connection时自动关闭Statement和ResultSet (下篇)

    在这个改进后的版本中,当离开try块时,所有的AutoCloseable对象(包括Connection、Statement和ResultSet)都会自动关闭,无论是否抛出异常,从而避免了资源泄露的问题。 此外,还可以考虑使用PreparedStatement和...

    poi根据ResultSet到处Excle源码

    - 错误处理和资源管理,如关闭数据库连接和流 总的来说,这个项目提供了一个便捷的方式来将数据库查询结果批量导出为Excel格式,对于需要处理大量数据并进行分析的场景非常实用。用户可以学习这个项目的源码,理解...

    ResultSet用法集锦

    默认情况下,`ResultSet`关闭时,未提交的事务可能会被回滚。确保正确管理和提交事务以保持数据一致性。 6. `ResultSet`的类型: 有三种类型的`ResultSet`,它们定义了结果集的滚动行为: - `TYPE_FORWARD_ONLY`:...

    如何从 Java 存储过程将 JDBC ResultSet 作为 Ref Cursor 返回.doc

    总结来说,从Java存储过程返回JDBC ResultSet作为REF CURSOR,主要是为了解决Oracle数据库的特性和JDBC的兼容问题。通过Oracle9i引入的特性,开发者可以利用这种方法在PL/SQL和Java之间更灵活地交换数据。然而,这种...

    java 代码笔记 2010-06-23 对ResultSet()的几个常用操作,实例。

    本篇笔记将深入探讨2010年6月23日记录的一些关于ResultSet的常用操作,结合实例进行讲解。 1. 创建与初始化 在Java中,我们通常通过Statement或PreparedStatement对象的executeQuery()方法执行SQL查询来获取...

    描述Connection、Statement、ResultSet接口的作用

    标题和描述均聚焦于解释Java Database Connectivity (JDBC)中三个核心接口——`Connection`、`Statement`和`ResultSet`的作用。这三个接口是JDBC API的核心组成部分,它们共同协作,使得Java应用程序能够与各种关系...

    javaResultSet常用方法.pdf

    - 使用`ResultSet`时要注意资源管理,使用完后要关闭以释放数据库连接和内存资源,防止资源泄漏。 - 对于可更新的结果集,务必在执行更新操作后调用`updateRow()`来将更改保存到数据库。 掌握这些`ResultSet`的...

    P6Spy的去掉ResultSet以及加入每日归档

    关闭不再使用的ResultSet可以释放资源,提高系统性能。在P6Spy中,可以通过配置来控制对ResultSet的处理,例如设置合适的fetch size,或者在操作完成后立即关闭。 **加入每日归档** "加入每日归档"涉及的是数据库的...

    mysq_ jdbc连接与关闭封装代码

    在实际的应用程序中,可以调用`DbClose.java`中的这些方法来确保资源被正确关闭,避免内存泄漏等问题。例如,在执行完查询后,可以这样关闭资源: ```java ResultSet rs = null; Statement stmt = null; Connection ...

    jdbc学习文档

    6. **关闭资源**:最后关闭Statement、ResultSet和Connection对象。 **1.4 QuickStart示例** 示例代码展示了如何使用JDBC连接数据库并执行查询操作: ```java // 加载MySQL数据库驱动 Class.forName(...

    java测试数据库连接关闭

    在Java中,我们可以使用try-with-resources语句,它会自动关闭在try块中声明的实现了AutoCloseable接口的对象,例如Connection、Statement和ResultSet。 下面是一个示例,展示了如何正确关闭数据库连接: ```java ...

    java.sql.SQLException: 结果集已耗尽

    解决这个问题需要对ResultSet的使用进行审查,确保正确处理数据和关闭资源,同时检查SQL查询和数据库连接设置。在JSP环境中,还需要考虑页面生命周期和与后台数据库交互的逻辑。通过这些步骤,通常可以找出并修复...

    hikariCP 光连接池

    HikariCP-java7-2.4.10.jar 光连接池 传说光一样的速度.

    jdbc练习题1.doc

    在实际应用中,为了提高代码的可维护性和安全性,应使用PreparedStatement防止SQL注入,同时注意关闭数据库连接、Statement和ResultSet等资源。此外,还可以考虑使用Connection池管理数据库连接,提高应用程序的性能...

    CallableStatement调用Oracle存储过程返回结果集(ResultSet).docx

    本篇将详细介绍如何使用CallableStatement调用Oracle存储过程,并处理返回的结果集(ResultSet)。 一、无返回值的存储过程 在Oracle中,一个无返回值的存储过程可能只执行某些操作,例如插入数据。以下是一个简单...

    CallableStatement调用Oracle存储过程返回结果集(ResultSet).pdf

    在Java编程中,CallableStatement接口是用来执行SQL存储过程或函数的。在Oracle数据库中,存储过程可以接收输入参数、输出参数或两者...对于返回结果集的存储过程,可以利用ResultSet遍历每一行数据,获取所需的信息。

    java 真正的安全的资源的释放

    2. **资源关闭顺序**:建议先关闭`ResultSet`,然后关闭`PreparedStatement`,最后关闭`Connection`。这是因为`PreparedStatement`和`Connection`的关闭操作可能会关闭它们所持有的资源。 3. **异常处理**:在关闭...

    JSP网络编程数据库连接建立与关闭

    最后,为了释放系统资源,必须按照顺序关闭`ResultSet`、`Statement`和`Connection`,以避免内存泄漏。 实验结果包括了创建数据库、建表、插入数据、配置ODBC数据源以及在MyEclipse环境中成功连接到数据库。实验...

Global site tag (gtag.js) - Google Analytics