Connection.close()的实现解析

本文探讨了在使用JDBC进行数据库操作时,Connection.close()方法的实际作用范围。实验表明仅关闭Connection即可间接关闭其上创建的所有Statement和ResultSet,尽管如此,从代码可读性和习惯上考虑,仍然建议显式关闭。

在写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驱动是否也是这样处理的,猜想应该是一样的。虽然可以省略两行程序,但从代码的可读性以及编程习惯上来说,加上会更好一些,省略了的话,代码的连贯性不好,因而是不推荐的。

### Java 中使用 `HttpURLConnection` 发起 GET 请求并读取响应内容的示例代码解析 在 Java 中,`HttpURLConnection` 是一个用于发起 HTTP 请求的标准类,支持 GET、POST 等常见方法。以下是一个典型的使用 `HttpURLConnection` 发起 GET 请求并读取响应内容的完整示例: ```java import java.io.*; import java.net.HttpURLConnection; import java.net.URL; public class HttpGetExample { public static void main(String[] args) { try { String url = "https://www.baidu.com/"; URL httpUrl = new URL(url); HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(15000); connection.setReadTimeout(60000); connection.connect(); if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) { InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); String line; StringBuilder buffer = new StringBuilder(); while ((line = reader.readLine()) != null) { buffer.append(line); } reader.close(); System.out.println(buffer.toString()); } connection.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } ``` 代码中通过 `URL` 类创建一个指向目标地址的对象,并调用 `openConnection()` 方法获取 `HttpURLConnection` 实例。随后设置请求方法为 GET,并定义连接和读取超时时间,以提高网络请求的稳定性与效率。在调用 `connect()` 方法后,程序会向服务器发送请求,并通过 `getInputStream()` 获取服务器返回的数据流。使用 `BufferedReader` 逐行读取响应内容,并将其拼接到 `StringBuilder` 对象中,最终输出到控制台[^4]。 ### 代码关键点解析 - `URL` 和 `HttpURLConnection` 的结合使用,可以实现对远程资源的访问。 - `setRequestMethod("GET")` 明确指定了请求方式为 GET,适用于获取数据。 - 设置 `setConnectTimeout()` 和 `setReadTimeout()` 是为了防止网络不稳定导致的长时间阻塞。 - `getInputStream()` 用于获取服务器返回的数据流,若响应码为 200 表示请求成功。 - 使用 `BufferedReader` 逐行读取数据,提高了内存使用效率。 - 最后调用 `disconnect()` 断开连接,释放资源。 上述实现方式适用于大多数需要通过 GET 请求获取网页内容或 API 接口数据的场景[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值