数据库连接要命的一种写法(释放不了的bug)

一般在数据库操作的时候,都会涉及连接的关闭问题。

如果关闭不了,服务器会越来越慢,最好挂掉。如果是数据库连接池的时候可以配置输出log。

tomcat的context.xml设定例子:

 <Resource name="jdbc/postgres" auth="Container"
           type="javax.sql.DataSource"
           driverClassName="org.postgresql.Driver"
           url="jdbc:postgresql://localhost:5432/myDB"
           username="postgres" password="postgres"
           maxActive="20" maxIdle="10" maxWait="-1"
           removeAbandoned="true"  removeAbandonedTimeout="300" logAbandoned="true"
  />


在出现没有关闭的情况下,会输入错误信息。根据提示的class就可以找到错误的地方了。


下面是一种比较不好的写法。

 // 取得连接
    Connection con = null;
    try {
        ds = (DataSource)(new InitialContext.lookup("....");
        con = ds.getConnection();
    } catch (NamingException e){
        //错误处理1
        ……
 
      } catch (SQLException e){
        //错误处理2
        ……
 
    }
 
    //事务处理
     ……
    // 关闭连接
    try {
        con.close();
    } catch (SQLException e) {
        // 错误处理
        ……

    }

这种写法findbug都不能发现问题。如果不仔细查看也不一定能发现问题。确实有了关闭的动作。

但是仔细分析就会发现,这种写法是比较要命的。如果在关闭之前就异常了,那这个链接就没法被关闭了。

一般代表性的写法如下:

    Connection con = null;
    try {
        ds = (DataSource)(new InitialContext.lookup("....");
        con = ds.getConnection();
        //事务处理
         …
    } catch (NamingException e){
        // 错误处理
        ……
    } catch (SQLException e){
        // 错误处理
        ……
 
    } finally {
        if (con!=null) {
            con.close();
        }
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值