ThreadLocal类:这个类提供线程局部变量。这些变量与其对应方式不同,因为访问每个线程都有自己独立初始化的变量副本。ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段。
ThreadLocal里边有两个方法get()和set()方法用于向当前线程中添加一个map集合key为当前的ThreadLocal对象,value为添加到ThreadLocal的对象。get的时候获取的是当前ThreadLocal对应的value值,即存放进的对象。
源码
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
每次存入数据时,先得到当前线程,然后得到当前线程的一个map集合,判断map集合是否为空,为空则添加键值对,不为空,则不添加键值对。键:当前ThreadLocal值:存入的对象,放入的是当前线程的一个空间,数据线程不属于ThreadLocal.
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); }
事务的一致性可以通过ThreadLocal来实现,定义工具类时,通过定义一个静态的ThreadLocal变量来存储Conllection对象,保证service层和dao层获得的数据库连接属于同一个连接,然后通过这同一个连接对数据库进行一些列操作,以及事务的回滚等等,从而保证事务的执行。
例子:
public class DBUtils {
private static ComboPooledDataSource cs=new ComboPooledDataSource();
public static ThreadLocal<Connection> th=new ThreadLocal<Connection>();
public static DataSource getDataSource(){
return cs;
}
public static Connection getConnection() throws SQLException{
Connection conn = th.get();
if(conn==null){
conn=cs.getConnection();
th.set(conn);
}
return conn;
}
}
Java事务的提交通过Connection进行提交,设置当前事务手动提交conn.setAutoCommit(false)设置事务回滚conn.rollback()设置事务提交conn.commit()所以如果dao层和service层获得的connection不是同一个,便不能保证事务的正确提交。
扫描二维码关注公众号,回复:
274848 查看本文章
ThreadLocal 类:这个类提供线程局部变量。这些变量与其对应方式不同,因为访问每个线程都有自己独立初始化的变量副本。ThreadLocal实例通常是希望将状态与线程关联的类中的私有静态字段。 ThreadLocal里边有两个方法get()和set()方法用于向当前线程中添加一个map集合key为当前的ThreadLocal对象,value为添加到ThreadLocal的对象。get的时候获取的是当前ThreadLocal对应的value值,即存放进的对象。 源码 每次存入数据时,先得到当前线程,然后得到当前线程的一个map集合,判断map集合是否为空,为空则添加键值对,不为空,则不添加键值对。键:当前ThreadLocal值:存入的对象,放入的是当前线程的一个空间,数据线程不属于ThreadLocal. 事务的一致性可以通过ThreadLocal来实现,定义工具类时,通过定义一个静态的ThreadLocal变量来存储Conllection对象,保证service层和dao层获得的数据库连接属于同一个连接,然后通过这同一个连接对数据库进行一些列操作,以及事务的回滚等等,从而保证事务的执行。 例子:
public class DBUtils {
private static ComboPooledDataSource cs=new ComboPooledDataSource();
public static ThreadLocal<Connection> th=new ThreadLocal<Connection>();
public static DataSource getDataSource(){
return cs;
}
public static Connection getConnection() throws SQLException{
Connection conn = th.get();
if(conn==null){
conn=cs.getConnection();
th.set(conn);
}
return conn;
}
}
Java事务的提交通过Connection进行提交,设置当前事务手动提交conn.setAutoCommit(false)设置事务回滚conn.rollback()设置事务提交conn.commit()所以如果dao层和service层获得的connection不是同一个,便不能保证事务的正确提交。