public static void main(String[] args) {  Connection conn = null;  Statement state = null;  ResultSet set = null;  try {  //注册数据库驱动  DriverManager.registerDriver(new Driver());  //获取数据库连接     conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "");  //获取传输器对象  state= conn.createStatement();  //利用传输器对象执行sql语句  set=state.executeQuery("select * from emp");  while(set.next()){  System.out.println(set.getString("name"));  }  } catch (SQLException e) {  // TODO Auto-generated catch block  e.printStackTrace();  }finally{  try {  set.close();  state.close();  conn.close();  } catch (SQLException e) {  // TODO Auto-generated catch block  e.printStackTrace();  }  }  }

(遵循先开启后关闭原则)

finally语句在什么情况下都会执行,就算有return的情况下也是先return再finally.

可以看到这些代码的最后有三句XX.close释放资源,但是这样写释放资源还是有问题的,由于上篇博客是入门的,所以就不探讨过于复杂的问题,把重点放在如何使用jdbc上了。
那么本篇博客将讨论如何释放资源。

在jdbc中Connection是非常稀有的资源,使用完之后应当马上释放,甚至还要以”迟占用,早释放“的原则使用,也就是说在使用的过程中尽可能地要用的时候才创建Connection一用完应当立刻关闭释放。

而且上面那段代码一开始:

Connection conn = null;  Statement state = null;  ResultSet set = null;  

就定义了三个空值,如果往下执行,还没执行到给他们三个变量赋值就抛异常了,这个时候程序会catch一场然后执行finally里面的语句,但是这个时候set,state,conn都是空的,空的对象调用方法又会抛出nullpointexception,这个时候整个程序就崩溃了。所以在关闭之前必须先判空 。
尽管进行了判空再关闭资源还是会有问题的,请看最后关闭资源的时候:

try {  set.close();  state.close();  conn.close();  } catch (SQLException e) {  // TODO Auto-generated catch block  e.printStackTrace();  }

把所有关闭语句写在同一个try块里面,一旦前面的管比喻句抛异常,后面的关闭语句就无法执行了,所以不能这样写,要给每个关闭语句一个try块。最后为了保证资源能够释放,还有在每个关闭语句的后面加一个finally,在finally里给要关闭的资源赋值为空。这样就算在关闭过程中抛异常不能及时关闭,但是由于赋值为空,没有引用该资源,在垃圾回收的时候也能够回收。
下面是严谨正确的关闭资源的写法,对于其它关闭资源也可以参考这种写法:

package com.javy.jdbc;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;import com.mysql.jdbc.Driver;public class JdbcDemo1 {public static void main(String[] args) {Connection conn = null;Statement state = null;ResultSet set = null;try {// 注册数据库驱动DriverManager.registerDriver(new Driver());Class.forName("com.mysql.jdbc.Driver");// 获取数据库连接conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "");// 获取传输器对象state = conn.createStatement();// 利用传输器对象执行sql语句set = state.executeQuery("select * from emp");while (set.next()) {System.out.println(set.getString("name"));}} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {//            6、释放资源if (set!= null) {try {set.close();} catch (Exception e1) {e1.printStackTrace();}}if (state != null) {try {state.close();} catch (Exception e2) {e2.printStackTrace();}}if (conn != null) {try {conn.close();} catch (Exception e2) {e2.printStackTrace();}}}

JDBC:JDBC资源释放的细节问题相关推荐

  1. Linux 释放socket资源,LwIP使用select,close socket资源释放不完全问题

    这篇文章本应该在4月就写好的,但是博客评论系统一直没有搭建好,走了很多弯路,现在好了,delay这么久,终于要要补过来了.自建博客:金宝的博客 该文章完全原创,除通用.广泛的知识点外,均为个人总结,如 ...

  2. Java8 新的 try-with-resources 语句,自动资源释放

    读取文件后需要释放资源,对于占用内存比较大的,非常重要: (1)读取文件内存占用较多的优化方式: 一次读取部分处理完继续读取,可以有效的减少内存的占用: 使用RandomAccessFile可以从文件 ...

  3. 基于 Android NDK 的学习之旅-----资源释放

    基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...

  4. C#资源释放及Dispose、Close和析构方法

    C#资源释放及Dispose.Close和析构方法   备注:此文的部分观点有误,之所以仍旧保留本文,是需要在后期给出一个勘误版.正确的版本在这里"C#中标准Dispose模式的实现&quo ...

  5. rhcs做HA时的资源释放脚本实现

    场景: CentOS6.3的二次封装版本,安装hortonworks的hadoop发行版,并按照其官方文档实现高可用,但无fence设备支持,因此导致断网和断电测试时,备用HA节点无法得到资源释放的通 ...

  6. C#中的非托管资源释放(FinalizeDispose)

    在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源. a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对 ...

  7. c#中的非托管资源释放 (Finalize和Dispose)

    c#中的非托管资源释放 (Finalize和Dispose) 收藏 在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源. a.其中托管资源一般是指被CLR ...

  8. C#内存泄露与资源释放 经验总结

    本文链接:http://blog.csdn.net/yokeqi/article/details/41083939 C#相比其他语言,拥有强大的垃圾回收机制,但并不是这样,你就可以对内存管理放任不管, ...

  9. c#自定义控件资源释放问题_定义资源

    c#自定义控件资源释放问题 在Fielding的论文中 ,资源描述为: "可以命名的任何信息"--"文档或图像,临时服务(例如,"洛杉矶今天的天气") ...

  10. HttpClient示例及资源释放

    HttpClient示例及资源释放 点关注不迷路,欢迎再访! 精简博客内容,尽量已行业术语来分享. 努力做到对每一位认可自己的读者负责. 帮助别人的同时更是丰富自己的良机. 目录 HttpClient ...

最新文章

  1. rtsp发送主流和辅流
  2. boost::graph::distributed::hohberg_biconnected_components用法的测试程序
  3. 2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml
  4. P4781-[模板]拉格朗日插值
  5. Java Hashtable containsValue()方法与示例
  6. C# DateTime日期格式
  7. 并发编程常见面试题总结四
  8. 差分相干解调 matlab,差分码PSK信号的相干解调系统仿真
  9. 10个简单的放松运动
  10. OTFS调制中的干扰分析
  11. spacy教程--基础
  12. 为网页中的图片添加水印的效果
  13. 什么是软文?什么是软文广告?
  14. Navicat连接腾讯服务器时常见错误
  15. VBA之正则表达式(3)-- 特殊公式计算
  16. freemarker
  17. 网络工程课程设计_某学校网络设计
  18. 学会如何获得手机root权限,快速解决手机空间不足难题
  19. java 遍历map key_java 遍历Map的四种方式
  20. 会声会影2019专业序列号激活版(视频制作软件)V22.3.0.439 简体中文

热门文章

  1. css文本超出div隐藏剩下内容并显示省略号
  2. Python 之MySql 每日一练 130——同名同性学生名单,并统计人数
  3. AUTOSAR汽车电子嵌入式编程精讲300篇-汽车LIN总线网络通信的研究及上位机设计(续)
  4. 红帽企业 Linux 8.0,红帽发布企业版 Linux(RHEL) 8.0 | Linux 中国
  5. 发作性睡病的症状有哪些?
  6. 苹果cmsv10仿好看的韩剧集网高端免费PC模板
  7. 读书笔记--文字符号
  8. Go语言实现Bouncing Balls
  9. 5个免费的3D钣金CAD软件
  10. 你知道到底什么才是 Valhalla 项目么?