JDBC—JDBC的资源释放

版权声明:. 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;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/WildestDeram/article/details/89601316