HelloCalifornia 2017-04-13 06:41 采纳率: 50%
浏览 2355
已采纳

java中JDBC资源关闭问题

在这种情况下ResultSet和PrepareStatement是否需要关闭:


public static void main(String[] args1) throws Exception{
    //通过工厂获得一个c3p0管理的连接
    Connection conn = ConnectionFactory.getConnection();
    //传入方法
    unclosePreparedStatementAndResultSet(conn);
    //释放连接
    conn.close();
}
public static void unclosePreparedStatementAndResultSet(Connection conn) throws SQLException{
        String sql="select * from student";
        PreparedStatement ps =conn.prepareStatement(sql);
        ResultSet rs=ps.executeQuery();
    }


简单起见,异常就不捕获了,当程序不出错的时候,是否需要在方法中

 rs.close();
 ps.close();

毕竟Connection在后面会释放
问题在于,使用c3p0连接池的时候,是释放连接而不是关闭连接,那么,rs和ps是否还一直持有连接池里面的连接呢?就算垃圾回收了,也有可能存在脏连接吗?
换种说法,我Connection.close()了,rs和ps还是可以继续查询的吗?


测试了一下,c3p0连接池在你关闭Connection的时候也会关闭rs和ps,当你next会报如下错误

 Exception in thread "main" java.sql.SQLRecoverableException: 关闭的 Resultset

心里还是比较模糊,有没有大神指点一下,小弟感激不尽

  • 写回答

1条回答 默认 最新

  • 点点滴滴的淡淡的 2017-04-13 06:59
    关注

    你建立了一次数据库连接,就可以做很多操作,如ps就是预编译sql语句,知道代入参数,就可以得到rs,但是这都是建立数据库连接的基础上的。关了,啥都干不了了。
    规范说明:connection.close 自动关闭 Statement.close 自动导致 ResultSet 对象无效(注意只是 ResultSet 对象无效,ResultSet 所占用的资源可能还没有释放)。所以还是应该显式执行connection、Statement、ResultSet的close方法。特别是在使用connection pool的时候,connection.close 并不会导致物理连接的关闭,不执行ResultSet的close可能会导致更多的资源泄露。
    http://blog.csdn.net/hantiannan/article/details/7904855

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?