JDBC:JDBC资源释放的细节问题
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资源释放的细节问题相关推荐
- Linux 释放socket资源,LwIP使用select,close socket资源释放不完全问题
这篇文章本应该在4月就写好的,但是博客评论系统一直没有搭建好,走了很多弯路,现在好了,delay这么久,终于要要补过来了.自建博客:金宝的博客 该文章完全原创,除通用.广泛的知识点外,均为个人总结,如 ...
- Java8 新的 try-with-resources 语句,自动资源释放
读取文件后需要释放资源,对于占用内存比较大的,非常重要: (1)读取文件内存占用较多的优化方式: 一次读取部分处理完继续读取,可以有效的减少内存的占用: 使用RandomAccessFile可以从文件 ...
- 基于 Android NDK 的学习之旅-----资源释放
基于 Android NDK 的学习之旅-----资源释放 做上一个项目的时候因为与C引擎交互频繁,有时候会突然莫名其妙的的整个应用程序直接挂掉.因为我是学Java 开始的,所以对主动释放内存没多大概 ...
- C#资源释放及Dispose、Close和析构方法
C#资源释放及Dispose.Close和析构方法 备注:此文的部分观点有误,之所以仍旧保留本文,是需要在后期给出一个勘误版.正确的版本在这里"C#中标准Dispose模式的实现&quo ...
- rhcs做HA时的资源释放脚本实现
场景: CentOS6.3的二次封装版本,安装hortonworks的hadoop发行版,并按照其官方文档实现高可用,但无fence设备支持,因此导致断网和断电测试时,备用HA节点无法得到资源释放的通 ...
- C#中的非托管资源释放(FinalizeDispose)
在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源. a.其中托管资源一般是指被CLR控制的内存资源,这些资源的管理可以由CLR来控制,例如程序中分配的对 ...
- c#中的非托管资源释放 (Finalize和Dispose)
c#中的非托管资源释放 (Finalize和Dispose) 收藏 在了解Finalize和Dispose之前,我们需要了解两个概念,一个是托管资源,一个非委托资源. a.其中托管资源一般是指被CLR ...
- C#内存泄露与资源释放 经验总结
本文链接:http://blog.csdn.net/yokeqi/article/details/41083939 C#相比其他语言,拥有强大的垃圾回收机制,但并不是这样,你就可以对内存管理放任不管, ...
- c#自定义控件资源释放问题_定义资源
c#自定义控件资源释放问题 在Fielding的论文中 ,资源描述为: "可以命名的任何信息"--"文档或图像,临时服务(例如,"洛杉矶今天的天气") ...
- HttpClient示例及资源释放
HttpClient示例及资源释放 点关注不迷路,欢迎再访! 精简博客内容,尽量已行业术语来分享. 努力做到对每一位认可自己的读者负责. 帮助别人的同时更是丰富自己的良机. 目录 HttpClient ...
最新文章
- rtsp发送主流和辅流
- boost::graph::distributed::hohberg_biconnected_components用法的测试程序
- 2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml
- P4781-[模板]拉格朗日插值
- Java Hashtable containsValue()方法与示例
- C# DateTime日期格式
- 并发编程常见面试题总结四
- 差分相干解调 matlab,差分码PSK信号的相干解调系统仿真
- 10个简单的放松运动
- OTFS调制中的干扰分析
- spacy教程--基础
- 为网页中的图片添加水印的效果
- 什么是软文?什么是软文广告?
- Navicat连接腾讯服务器时常见错误
- VBA之正则表达式(3)-- 特殊公式计算
- freemarker
- 网络工程课程设计_某学校网络设计
- 学会如何获得手机root权限,快速解决手机空间不足难题
- java 遍历map key_java 遍历Map的四种方式
- 会声会影2019专业序列号激活版(视频制作软件)V22.3.0.439 简体中文