java no resultset_在哪里关闭java PreparedStatements和ResultSet?

erickson..

45

在Java 7中,不应显式关闭它们,而应使用自动资源管理来确保关闭资源并正确处理异常.异常处理的工作方式如下:

Exception in try | Exception in close | Result

-----------------+--------------------+----------------------------------------

No | No | Continue normally

No | Yes | Throw the close() exception

Yes | No | Throw the exception from try block

Yes | Yes | Add close() exception to main exception

| | as "suppressed", throw main exception

希望这是有道理的.允许漂亮的代码,像这样:

private void doEverythingInOneSillyMethod(String key)

throws MyAppException

{

try (Connection db = ds.getConnection()) {

db.setReadOnly(true);

...

try (PreparedStatement ps = db.prepareStatement(...)) {

ps.setString(1, key);

...

try (ResultSet rs = ps.executeQuery()) {

...

}

}

} catch (SQLException ex) {

throw new MyAppException("Query failed.", ex);

}

}

在Java 7之前,最好使用嵌套的finally块,而不是测试null的引用.

我将展示的示例可能看起来很难看深嵌套,但实际上,设计良好的代码可能不会在同一个方法中创建连接,语句和结果; 通常,每个嵌套级别都涉及将资源传递给另一个方法,该方法将其用作另一个资源的工厂.使用这种方法,来自a close()的异常将掩盖try块内的异常.这可以克服,但它会导致代码更加混乱,并且需要一个自定义异常类,它提供Java 7中存在的"抑制"异常链.

Connection db = ds.getConnection();

try {

PreparedStatement ps = ...;

try {

ResultSet rs = ...

try {

...

}

finally {

rs.close();

}

}

finally {

ps.close();

}

}

finally {

db.close();

}

Ctrl-Shift-F到您心中的内容!;) (8认同)

如果你把终点放在与右大括号相同的线上,那就不那么难看了.;) (6认同)

@ceving没有人建议可以避免结束陈述.你在回应什么? (2认同)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值