• JDBC | 第六章: JDBC连接资源的关闭和释放


    为什么需要释放jdbc资源

    提问:
    Connection、Statement和ResulSet?这三个对象是在方法内部定义的,则这三个对象不是在方法执行完毕就消失了么,为什么还要单独去关闭它们呢?
    解答:
    这个连接是与数据库服务器的一个连接,虽然你的方法结束了,但是这个资源依然存在数据库连接并没有释放
    提问:
    为什么在JDBC对数据库访问结束后,要按先关闭ResultSet,然后关闭PreparedStatement,最后关闭Connection,直接关闭Connection不就行了吗?
    解答:

    1. 感觉上好象是只要把connection给关闭了,系统就能正常运行了。 那在查询或是其它操作中,如果只关闭Connection,不作ResultSet 和 Statement 的关闭的话,对系统性能是否会有影响呢。或者是其它实方面的不良影响。
      如果你不使用连接池,那么就没有什么问题,一旦Connection关闭,数据库物理连接就被释放,所有相关Java资源也可以被GC回收了。 但是如果你使用连接池,那么请注意,Connection关闭并不是物理关闭,只是归还连接池,所以PreparedStatement和ResultSet都被持有,并且实际占用相关的数据库的游标资源,在这种情况下,只要长期运行,往往就会报“游标超出数据库允许的最大值”的错误,导致程序无法正 常访问数据库

    2. 因为你打开的时候有顺序,
      打开时:Connection -> PreparedStatement -> ResultSet
      关闭时:ResultSet-> PreparedStatement -> Connection
      这个就像 栈,后进先出

    资源关闭代码

    //关闭数据库的资源的顺序最好与使用的顺序相反
    //数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放
     //都要加try catch 以防前面关闭出错,后面的就不执行了
        public static void close(ResultSet rs, PreparedStatement pstmt, Connection conn) {
            if (rs != null) {
                try {
                    rs.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    

    完整项目案例
    点击这里 github

  • 相关阅读:
    iOS有用的三方库和高效工具记录
    正则表达式
    Exception Type & Exception Code
    信鸽推送(XGPush)
    在vue中使用animate.css
    vue 中父子组件传值:props和$emit
    预编译scss以及scss和less px 转rem
    ES6箭头函数及模版字符串
    移动端页面a input去除点击效果及pc端切换
    vue2搭建简易spa
  • 原文地址:https://www.cnblogs.com/kenx/p/13554581.html
Copyright © 2020-2023  润新知