OpenSessionInViewFilter线程绑定session
来源:互联网 发布:胆拖式旋转矩阵关注法 编辑:程序博客网 时间:2024/05/16 14:28
我们知道OpenSessionInViewFilter是通过TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));来达到线程绑定的。
抽象类TransactionSynchronizationManager的一些主要属性和方法:
private static final ThreadLocal resources =
new NamedThreadLocal("Transactional resources");//保存了当前线程的session和Transactional信息
private static final ThreadLocal synchronizations =
new NamedThreadLocal("Transaction synchronizations");
private static final ThreadLocal currentTransactionName =
new NamedThreadLocal("Current transaction name");
private static final ThreadLocal currentTransactionReadOnly =
new NamedThreadLocal("Current transaction read-only status");
private static final ThreadLocal currentTransactionIsolationLevel =
new NamedThreadLocal("Current transaction isolation level");
private static final ThreadLocal actualTransactionActive =
new NamedThreadLocal("Actual transaction active");
public static void bindResource(Object key, Object value) throws IllegalStateException {//绑定session到当前线程Object actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);//去除包装Assert.notNull(value, "Value must not be null");Map map = (Map) resources.get();// set ThreadLocal Map if none foundif (map == null) {map = new HashMap();resources.set(map);}if (map.put(actualKey, value) != null) {throw new IllegalStateException("Already value [" + map.get(actualKey) + "] for key [" +actualKey + "] bound to thread [" + Thread.currentThread().getName() + "]");}if (logger.isTraceEnabled()) {logger.trace("Bound value [" + value + "] for key [" + actualKey + "] to thread [" +Thread.currentThread().getName() + "]");}}
public static Object unbindResource(Object key) throws IllegalStateException {//解绑当前线程的sessionObject actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);Object value = doUnbindResource(actualKey);if (value == null) {throw new IllegalStateException("No value for key [" + actualKey + "] bound to thread [" + Thread.currentThread().getName() + "]");}return value;}
public static boolean hasResource(Object key) {//判断当前线程是否已经绑定了session,key是sessionFactory对象,一个sessionFactory可以绑定一个sessionObject actualKey = TransactionSynchronizationUtils.unwrapResourceIfNecessary(key);Object value = doGetResource(actualKey);return (value != null);}
注意:Map map = (Map) resources.get();
public class ThreadLocal<T> :
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); }将ThreadLocal<T>本身作为key,对应的泛型作为value
- OpenSessionInViewFilter线程绑定session
- Session线程绑定
- session与本地线程绑定
- hibernate 本地线程绑定session
- OpenSessionInViewFilter-no session
- Hibernate中Session与本地线程绑定
- 开启OpenSessionInViewFilter,为何仍报no session
- OpenSessionInViewFilter 以及session依然closed的解决方法
- 使用OpenSessionInViewFilter解决session关闭问题
- hibernate事务代码规范和session与本地线程绑定
- Hibernate中Session与本地线程作绑定
- Hibernate中Session与本地线程作绑定
- Session 对象的生命周期与本地线程绑定
- OpenSessionInViewFilter
- OpenSessionInViewFilter
- OpenSessionInViewFilter
- openSessionInviewFilter
- OpenSessionInViewFilter
- linux内核空间与用户空间信息交互方法
- 数据库_JDBC编程六步骤
- MB1A MB1B MB1C MB11 MIGO的区别解析
- JavaScript 中用"=="还是"===" 解答
- OpenSessionInView
- OpenSessionInViewFilter线程绑定session
- 关于程序员面试宝典中5.8节面试例题:编写一个函数,实现把C/C++程序代码中的注释去掉……答案的分析
- 对linux下异步通知fasync的理解
- b is not in the spans of the columns of the martix A
- Android各个版本命名(从1.5到6.0)
- POJ 1742 Coins (背包)
- C#读取Excel到DataSet的方法
- [erlang学习] 用observer远程监控节点 (随笔简记)
- 理解COM