1、ThreadLocal本地线程对象,内部可以存一个对象,该对象是与当前线程绑定的。同一个线程通过ThreadLocal的get方法取到的一定是同一个对象。
2、应用于获取Connection对象时:
建立一个ManagerThreadLocal类来从ThreadLocal中取Connection对象:
import java.sql.Connection;
public class ManagerThreadLocal {
private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
public static Connection getConnection(){
try{
Connection conn = tl.get();
//第一次取的时候从数据源取
if(conn == null){
System.out.println("第一次获取连接");
conn=DBCPSqlServer.getConn();
tl.set(conn);
}else{
System.out.println("第n次获取连接");
}
return conn;
}catch (Exception e){e.printStackTrace();}
return null;
}
}
单元测试的代码:
@org.junit.Test
public void testThreadLocal(){
Connection connection1 = ManagerThreadLocal.getConnection();
Connection connection2 = ManagerThreadLocal.getConnection();
System.out.println(connection1);
System.out.println(connection2);
}
从运行结果可知,获取到的两个连接为同一个。
3、可以将关于connection的操作全都写进ManagerThreadLocal,例如开启事务、提交事务、回滚、关闭连接(在关闭连接的同时还应该调用ThreadLocal的remove()方法,将连接与线程解绑)等,这样在service层就可以隐藏connection。