ThreadLocal
就是针对多个线程创建一个副本
每个线程都用自己的这个副本
就相当于一个线程的全局变量
这样多个线程用自己的不会影响
比如一个业务的事务怎么做到用一个连接
因为dao是单个的操作
这个时候可以用ThreadLocal
因为他是当前线程的全局变量
这样保证调用dao的业务执行时的数据库连接
是同一个
原理是每个线程维护一个map key是TheadLocal,value就是共享的值
每次都是对值进行改动
/**
* 管理事务
*/
public class TransactionManager {
private static ThreadLocal<Connection> local = new ThreadLocal<Connection>();
// 开启事务
public static void beginTransaction() throws SQLException {
Connection conn = JDBCUtils.getConnection();
conn.setAutoCommit(false);
// 将连接存入threadLocal
local.set(conn);
}
// 回滚事务
public static void rollback() throws SQLException {
Connection conn = local.get();
if (conn != null) {
conn.rollback();
conn.close();
// 清空threadLocal
local.remove();
}
}
// 提交事务
public static void commit() throws SQLException {
Connection conn = local.get();
if (conn != null) {
conn.commit();
// 清空threadLocal
local.remove();
}
}
// 关闭连接
public static void close() throws SQLException {
Connection conn = local.get();
if (conn != null) {
conn.close();
// 清空threadLocal
local.remove();
}
}
// 获取数据库连接
public static Connection getConnection() {
return local.get();
}
}
编写一个工具类,获取当前线程Threadlocal的值
然后接下的dao操作和service层的操作都靠这个获取链接数据库的对象即可
这样就保证一个业务的流程 由一个线程构成,然后也都是这一个连接池对象
以前总是不是很懂这个有什么用
现在终于明白了,就是一个全局线程共享变量