Connection.close()的实现解析
2007-07-02 23:51
330 查看
在写JDBC代码时,一般都会用如下的“八股文”的形式:
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement("select * from booktab");
rs = pstmt.executeQuery();
while (rs.next()) {
// traverse the records
}
} catch (SQLException e) {
// handle exception
} finally {
if (rs != null) { try { rs.close(); } catch (Exception e) { } }
if (pstmt != null) { try { pstmt.close(); } catch (Exception e) { } }
if (conn != null) { try { conn.close(); } catch (Exception e) { } }
}
两个注意点:1、将关闭连接代码写到finally块中,即不管是否抛异常都要执行;2、要进行非空判断(如pstmt != null),防止抛NullPointerException异常。
作者学JDBC的时候,也是照着上述范例代码,稍作修改用到自己的程序中,前阵子突发奇想,在关闭中能否只调用Connection.close()方法而不事先调用ResultSet和Statement的close()方法?通过实验(MySQL5.1.14+mysql-connector-java-5.0.5-bin.jar的驱动程序),验证了是可行的。
首先,去掉ResultSet和Statement的close()方法调用,在finally块中只调用Connection.close():
if (conn != null) { try { conn.close(); } catch (Exception e) { } }
再在eclipse中进行单步跟踪,在上面代码上加一个断点,执行前查看rs和pstmt对象的属性isClosed值为false,执行完conn.close()方法后,rs和pstmt对象的属性isClosed值已经被修改为true,表明已经被关闭。
根据上面的分析,笔者虽然没有去读mysql的jdbc源代码,但猜测在Connection对象中会保存一个Statement对象的列表,并且每个Statement对象也会保存一个ResultSet对象,从而在调用Connection.close()方法时,会递归调用ResultSet.close()和Statement.close()方法,最后再关闭connection。
不知道其它数据库(如SQLServer/DB2/Sybase/PostgreSQL等)的jdbc驱动是否也是这样处理的,猜想应该是一样的。虽然可以省略两行程序,但从代码的可读性以及编程习惯上来说,加上会更好一些,省略了的话,代码的连贯性不好,因而是不推荐的。
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = getConnection();
pstmt = conn.prepareStatement("select * from booktab");
rs = pstmt.executeQuery();
while (rs.next()) {
// traverse the records
}
} catch (SQLException e) {
// handle exception
} finally {
if (rs != null) { try { rs.close(); } catch (Exception e) { } }
if (pstmt != null) { try { pstmt.close(); } catch (Exception e) { } }
if (conn != null) { try { conn.close(); } catch (Exception e) { } }
}
两个注意点:1、将关闭连接代码写到finally块中,即不管是否抛异常都要执行;2、要进行非空判断(如pstmt != null),防止抛NullPointerException异常。
作者学JDBC的时候,也是照着上述范例代码,稍作修改用到自己的程序中,前阵子突发奇想,在关闭中能否只调用Connection.close()方法而不事先调用ResultSet和Statement的close()方法?通过实验(MySQL5.1.14+mysql-connector-java-5.0.5-bin.jar的驱动程序),验证了是可行的。
首先,去掉ResultSet和Statement的close()方法调用,在finally块中只调用Connection.close():
if (conn != null) { try { conn.close(); } catch (Exception e) { } }
再在eclipse中进行单步跟踪,在上面代码上加一个断点,执行前查看rs和pstmt对象的属性isClosed值为false,执行完conn.close()方法后,rs和pstmt对象的属性isClosed值已经被修改为true,表明已经被关闭。
根据上面的分析,笔者虽然没有去读mysql的jdbc源代码,但猜测在Connection对象中会保存一个Statement对象的列表,并且每个Statement对象也会保存一个ResultSet对象,从而在调用Connection.close()方法时,会递归调用ResultSet.close()和Statement.close()方法,最后再关闭connection。
不知道其它数据库(如SQLServer/DB2/Sybase/PostgreSQL等)的jdbc驱动是否也是这样处理的,猜想应该是一样的。虽然可以省略两行程序,但从代码的可读性以及编程习惯上来说,加上会更好一些,省略了的话,代码的连贯性不好,因而是不推荐的。
相关文章推荐
- 动态代理实现数据库连接池功能(代理Connection的close方法)
- Android移动开发-使用HttpURLConnection和AsyncTask请求解析地理位置实现
- CommandBehavior.CloseConnection有何作用,详细解析
- phpExcelReader实现Excel解析
- 实现android注册登陆功能的客户端服务器源码与解析
- 两个队列实现栈,两个栈实现队列详细解析
- Android中使用HttpURLConnection实现GET POST JSON数据与下载图片
- 设计模式的解析和实现(C++)之十三-FlyWeight模式
- Enterprise Library深入解析与灵活应用(1):通过Unity Extension实现和Policy Injection Application Block的集成(转)
- 设计模式解析和实现(C++)之十九-Memento模式
- ASIHTTPRequest和libxml结合,实现边请求边解析
- 解析网站301重定向的实现方法,包括iis,apache,asp,php的方法
- 实现了一个简单的opera浏览器cookie文件解析库libo4f
- Android双向滑动菜单完全解析,教你如何一分钟实现双向滑动特效
- CountDownLatch & CyclicBarrier源码Android版实现解析
- 动态加载css方法实现和深入解析
- 动态加载css方法实现和深入解析
- 原生javascript实现解析XML文档与字符串
- 栈的图文解析 和 对应3种语言的实现(C/C++/Java)
- HttpURLConnection实现用户登录