版权声明:. https://blog.csdn.net/WildestDeram/article/details/89601316
JDBC的资源释放
JDBC程序运行完后,切记要把那些和数据相关的交互对象,这些对象通常是Connection、ResultSet和Statement,将其释放
回到程序中,不难发现该抒写方法存在漏洞。如果在某个位置突然出现异常,此时就会执行catch语句,而资源释放却没有被执行,这种写法存在弊端。
最好的办法就是将语句块存放到finally中,不管是否出现异常,finally中的语句都会被执行。但是这样写却报错,提示:"没有找到定义",因为conn,stat和res都是在try{}中定义。但是.....当我们在try{}外面定义Connection,Statement和ResultSet三个对象,发现也是报错,原因是没有遵循MySQL对于关闭资源的正确写法
在后面还要手动将三个资源设置为NULL,这样才符合Java垃圾回收机制。
finally中的代码这样抒写有写臃肿,后期可以写入工具类内,直接调用方法即可
最后完整的代码
package com.dream.demo1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
public class GoodJDBC {
@Test
public void goodJDBC() {
Connection conn = null;
Statement stat = null;
ResultSet res = null;
try {
// 1.连接数据库
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/dream1"+
"?useSSL=false&serverTimezone=Hongkong&useUnicode=true&characterEncoding=utf-8"
, "root", "1916");
/**
* 2.执行SQL语句
*/
// 2-1.编写SQL语句
String sql = "select * from goods where price<3500";
// 2-2.执行SQL语句
stat = conn.createStatement();
// 2-3.得到结果集
res = stat.executeQuery(sql);
// 2-4.遍历
while(res.next()) {
int id = res.getInt("id");
String name = res.getString("name");
float price = res.getFloat("price");
String desp = res.getString("desp");
System.out.println(id+"\t"+name+"\t"+price+"\t"+desp);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 3.关闭资源
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 手动将对象设置为NULL,符合Java垃圾回收机制
conn=null;
}
if(stat!=null) {
try {
stat.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
stat=null;
}
if(res!=null) {
try {
res.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
res=null;
}
}
}
}