优化数据库连接及关闭数据库连接:
有时候我们在一个项目中需要用到多次数据库连接,如果产生多个数据库连接对象,则其效率会低下,那么如何只产生一个数据库对象,这就要用到了一个ThreadLocal线程副本
ThreadLocal:
相当于银行,其他的类,其他调用方法相当于城市,
数据库连接(Connection)相当于钱,把钱存进去,到哪个城市用的钱都是一样的
package JavaTest;
import java.net.PasswordAuthentication;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.ResourceBundle;
import java.lang.ThreadLocal;
public class ThreadTest2 {
public static void main(String[] args) {
for (int i = 1; i < 10; i++) { //产生10个相同的数据库连接对象
try {
System.out.println(ThreadTest2.getConnection());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private static String driver = null;
private static String url = null;
private static String user = null;
private static String password = null;
static{
//可以通过读取资源文件为其赋值
try {
//获取资源文件解析器
ResourceBundle bundle= ResourceBundle.getBundle("DBOption");
driver =bundle.getString("DRIVER");
url = bundle.getString("URL");
user = bundle.getString("USERNAME");
password = bundle.getString("PASSWORD");
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
}
//数据库连接优化
private final static ThreadLocal<Connection> THREAD_LOCAL = new ThreadLocal<>();
public static Connection getConnection()throws Exception
{
//获取ThreadLocal绑定的Connection对象
Connection conn= THREAD_LOCAL.get();
//判断对象中是否存在连接对象
if(conn==null)
{ //没有连接对象,则创建一个数据库连接对象
conn = DriverManager.getConnection(url, user, password);
//将连接对象和当前线程绑定
THREAD_LOCAL.set(conn); //这是关键点,如果忘记绑定了那么就等于没有优化
}
return conn;
}
//关闭数据库
public static void close()
{
try{
//到线程副本中获取连接对象
Connection conn = THREAD_LOCAL.get();
//判断线程是否存在
if(conn != null){
//解除线程绑定关系
THREAD_LOCAL.set(null);//或者 threadLocal.remove();
//关闭数据库连接
conn.close();
}
}catch(Exception ex){
ex.printStackTrace();
}
}
}