- 浏览: 254514 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (232)
- 瞎扯两句 (8)
- 操作系统 (5)
- 工作笔记 (33)
- 设计模式 (1)
- java (57)
- Java IDE (7)
- hibernate (17)
- oracle (46)
- ms sql (2)
- spring (9)
- struts2 (0)
- javascript (16)
- java_code (2)
- java之集合 (2)
- java之线程 (4)
- java之IO (4)
- java之虚拟机 (6)
- java之异常 (0)
- EJB (4)
- XML (4)
- 数据结构-算法 (2)
- 架构设计 (5)
- 配置信息 (2)
- 阅读笔记 (6)
- IT专业英语 (1)
- PI (0)
- 单元测试 (1)
最新评论
之前看资料,总说spring hibernate 是通过threadlocal来实现并发。
更详细的就是session的产生是由threadlocal来实现并发控制,保证多线程安全。
但是只看讲解,真是不理解,时时如鲠在喉。今狠下心看了下源码,终于自认为搞明白了。
实际上就是一个threadlocal实例变量,这个类有get,set方法,且这个方法的特殊之处就在于能得到或设定线程的静态变量threadlocalMap的值,且threadlocalMap的key为该threadlocal实例变量!
根据个人理解详细如下:
sessionFactory 由spring的LocalSessionFactoryBean来产生。
在LocalSessionFactoryBean中,通过一系列的方法调用,最终会产生一个SessionFactoryImpl实例,这个实例就是spring容器管理的sessionFactory 。
而每一个HibernateTemplate都会持有这同一个sessionFactory 的引用。
当调用HibernateTemplate.getSession方法时,实际上是调用的SessionFactoryImpl的currentSessionContext的getCurrentSession()方法。在这个方法中会通过currentSessionContext所持有的ThreadLocal实例对象,去查询当前线程的静态变量ThreadLocalMap中是否保存有以currentSessionContext所持有的ThreadLocal实例对象为key对应的Map,且Map中有以当前sessionFactory 为key对应的session,有则用之,无则新建session并保存。
最终,一个thread的ThreadLocalMap状态如下
thread_1
ThreadLocalMap
table[Entiry](是一个数组 Entity[] table)
table[i]为 <ThreadLocal实例对象, Map<sessionfactory, session > >
其实就是ThreadLocalMap中有一个数组,数组中的每一个Entity,持有不同的threadlocal实例变量 和 Value.
当调用Threadlocal实例变量的get方法时,先取得当前线程的threadlocalmap变量,然后依次遍历该threadlocalmap变量中的table[entity],看哪一个entity持有的Threadlocal实例变量与当前的相匹配,匹配的话则取得对应的entity的value的值。
在hibernate的这里实际应用为:为一个Map且这个Map中也有一个映射,key为HibernateTemplate所持有的sessionFactory ,值为曾将创建过的session。简而言之,就是双重Map!!!ThreadLocalMap的key对应的值为Map类型的目的是区分不同的sessionFactory 对应的session。
这样,当不同的客户请求时,服务器负责产生不同的thread来处理客户的request,对于不同的thread,由同一个ThreadLocal实例变量来负责为不同的thread绑定对应的session。同一线程对应同一客户,就能保证具有同一个session。
更详细的就是session的产生是由threadlocal来实现并发控制,保证多线程安全。
但是只看讲解,真是不理解,时时如鲠在喉。今狠下心看了下源码,终于自认为搞明白了。
实际上就是一个threadlocal实例变量,这个类有get,set方法,且这个方法的特殊之处就在于能得到或设定线程的静态变量threadlocalMap的值,且threadlocalMap的key为该threadlocal实例变量!
根据个人理解详细如下:
sessionFactory 由spring的LocalSessionFactoryBean来产生。
在LocalSessionFactoryBean中,通过一系列的方法调用,最终会产生一个SessionFactoryImpl实例,这个实例就是spring容器管理的sessionFactory 。
而每一个HibernateTemplate都会持有这同一个sessionFactory 的引用。
当调用HibernateTemplate.getSession方法时,实际上是调用的SessionFactoryImpl的currentSessionContext的getCurrentSession()方法。在这个方法中会通过currentSessionContext所持有的ThreadLocal实例对象,去查询当前线程的静态变量ThreadLocalMap中是否保存有以currentSessionContext所持有的ThreadLocal实例对象为key对应的Map,且Map中有以当前sessionFactory 为key对应的session,有则用之,无则新建session并保存。
最终,一个thread的ThreadLocalMap状态如下
thread_1
ThreadLocalMap
table[Entiry](是一个数组 Entity[] table)
table[i]为 <ThreadLocal实例对象, Map<sessionfactory, session > >
其实就是ThreadLocalMap中有一个数组,数组中的每一个Entity,持有不同的threadlocal实例变量 和 Value.
当调用Threadlocal实例变量的get方法时,先取得当前线程的threadlocalmap变量,然后依次遍历该threadlocalmap变量中的table[entity],看哪一个entity持有的Threadlocal实例变量与当前的相匹配,匹配的话则取得对应的entity的value的值。
在hibernate的这里实际应用为:为一个Map且这个Map中也有一个映射,key为HibernateTemplate所持有的sessionFactory ,值为曾将创建过的session。简而言之,就是双重Map!!!ThreadLocalMap的key对应的值为Map类型的目的是区分不同的sessionFactory 对应的session。
这样,当不同的客户请求时,服务器负责产生不同的thread来处理客户的request,对于不同的thread,由同一个ThreadLocal实例变量来负责为不同的thread绑定对应的session。同一线程对应同一客户,就能保证具有同一个session。
发表评论
-
JPA
2012-12-14 17:03 1344AppleFramework在数据访问控制层采用了Spring ... -
浅谈hibernate性能优化的几点建议
2012-05-17 16:41 752浅谈hibernate性能优化的几点建议1、针对oracle数 ... -
AAAAAAAAAAA
2012-05-17 16:22 789相信越来越多的web开发 ... -
hibernate 效率问题总结
2012-05-17 16:14 921一、“精心编写”的JDBC ... -
Hibernate 批量删除 问题
2012-05-17 15:24 858批量处理数据 通常, ... -
Hibernate 二级缓存
2012-04-20 10:35 904二级缓存 Hibernate 对数据的缓存包括两个级: ... -
hibernate对象的三种状态及之间的转换 .
2012-04-20 10:36 1114Hibernate的对象有3种状态,分别为:瞬时态(Trans ... -
Ioc asd
2012-04-18 13:56 39概念: IoC: 基本定义 bean definitio ... -
spring + hibernate 环境搭建中出现的问题总结
2012-04-08 20:20 912新搭建了一个环境,方便测试相关代码。 中间出现了几个小问题,折 ... -
spring AOP
2012-03-26 16:34 881DefaultAopProxyFactory.createAo ... -
wac.refresh
2012-03-16 11:21 1194public void refresh() throws Be ... -
webapplication 初始化
2012-03-15 18:22 823在web.xml中配置了ContextLoaderListen ... -
hibernate之检索策略与检索方式
2012-03-11 10:54 908检索策略包括 立即检索 延迟检索 迫切左外连接 类级别的可以 ... -
spring+hibernate中处理oracle BLOB
2012-02-28 16:11 8731、配置hibernate: 1.1、配置hiber ... -
使用JDBC和Hibernate来写入Blob型数据到Oracle中(1)
2012-02-28 16:09 835转 Oracle的Blob字段比较特殊,他比long字段的性 ... -
通通透透理解ThreadLocal,实现安全的多线程
2012-02-23 11:49 908我们知道Spring通过各种DAO模板类降低了开发者使用各种数 ... -
Spring 源码分析(一)ApplicationContext
2012-02-20 16:41 833web容器初始化时,因为配置了spring的ContextLo ... -
HibernateTemplate 源码分析(三)OpenSessionInViewFilter
2012-02-20 11:45 1069OpenSessionInViewFilter作为一个filt ... -
HibernateTemplate 源码分析(二)
2012-02-20 10:44 1098在Spring中使用Hibernate的方法: 因为最终需 ... -
Spring 笔记 之AOP
2012-02-18 21:14 101Spring AOP,采用动态代理机制和字节码生成技术实现,是 ...
相关推荐
例如,在Web应用服务器中,我们可以用ThreadLocal存储用户的会话信息,确保每个请求都访问到自己专属的数据。 ThreadLocal的使用通常包括以下步骤: 1. 创建ThreadLocal实例,声明变量类型。 2. 在需要的地方,通过...
**线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...
在实际应用中,理解ThreadLocal在Spring事务处理中的作用有助于优化并发性能和解决多线程环境下的事务问题。例如,如果线程之间需要共享数据,但又不想影响其他线程,ThreadLocal就是一个理想的选择。同时,也要注意...
- **弱引用**:ThreadLocalMap的键使用的是弱引用,当ThreadLocal变量不再被引用时,垃圾收集器可以回收ThreadLocal对象,但其在ThreadLocalMap中的引用不会立即被移除,以防止导致内存泄漏。 - **线程生命周期**:...
在Java中,ThreadLocal被广泛应用于Web中间件、服务端编程和微服务架构中,用以解决多线程环境下的数据隔离问题。 首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程...
NULL 博文链接:https://bijian1013.iteye.com/blog/2380233
在Java开发领域,Hibernate和Spring作为两个非常重要的框架,对于提高应用程序的开发效率、降低维护成本具有不可替代的作用。本文将针对这两个技术栈中的关键知识点进行深入探讨,并结合实际应用场景,帮助开发者更...
在Java多线程编程中,`ThreadLocal`是一个非常重要的工具类,它提供了一种在每个线程内部存储线程私有实例的方法。通常情况下,当多个线程共享某个变量时,可能会引发线程安全问题。而`ThreadLocal`则提供了另一种...
最后,Thread 类是线程类,在这个类中存在一个 threadLocals 变量,具体的类型是 ThreadLocal.ThreadLocalMap。 五、ThreadLocal 如何实现 set 方法 set 方法的实现非常重要,它的实现过程如下: 1. 获取当前线程...
3. 存储数据库会话:在Spring Hibernate ORM中,ThreadLocal常用来保存数据库连接的Session,确保每个线程有自己的Session,避免线程间的资源冲突。 总之,ThreadLocal是一个强大的工具,但理解其工作原理和潜在...
这个副本存储在线程的ThreadLocalMap中,这个Map是由Thread类维护的,键是ThreadLocal对象,值是线程局部变量的副本。 使用ThreadLocal的步骤如下: 1. 创建ThreadLocal实例。 2. 使用`set`方法设置线程局部变量的...
3. 熟悉Spring的AOP和IOC概念,理解它们在Spring中的应用。 4. 掌握Hibernate的查询方式,理解load()和get()的区别。 5. 熟悉Tiles框架,它是如何实现Web页面模板化。 6. 对应用服务器的概念有所了解,例如BEA ...
- 当你对ThreadLocal进行`set()`操作时,实际上是将值放入了当前线程的ThreadLocalMap中,键是ThreadLocal对象本身,值是你设置的对象。 - 当你调用`get()`时,它会查找当前线程的ThreadLocalMap,找到对应的键(即...
在实际应用中,如上文所示的Hibernate示例,通过`set()`方法可以将`Session`对象与当前线程绑定,而`get()`方法则用于获取当前线程的`Session`对象。这种设计模式避免了在多线程环境中直接操作共享资源可能带来的...
在实际开发中,有些框架如Spring已经内置了对ThreadLocal的管理和清理机制,可以更方便地在多线程环境中使用session。 总结,ThreadLocal是Java中处理线程局部数据的利器,特别适用于需要线程隔离的场景,如Web...
需要注意的是,ThreadLocal中的变量并不是存储在堆内存中,而是存储在线程的ThreadLocalMap中。 ```java ThreadLocal<String> threadLocal = new ThreadLocal(); threadLocal.set("线程A的值"); // 在线程A中,可以...
在ThreadLocal中,每个实例都有一个内部Map,这个Map存储了键值对,键是ThreadLocal实例,值就是线程本地的变量副本。在JDK 8之前,这个内部Map是`ThreadLocal.ThreadLocalMap`,而从JDK 8开始,改为了`...
2. **请求上下文**:在Web应用中,可以使用`ThreadLocal`保存HttpServletRequest或Session对象,方便在同一个请求处理链路中访问。 3. **线程状态**:记录线程执行过程中的状态,例如事务管理、计数器等。 然而,...
由于ThreadLocal变量是存储在线程的ThreadLocalMap中,如果线程长时间运行并且不清理ThreadLocal,当ThreadLocal对象被垃圾收集时,其在ThreadLocalMap中的引用将变为"幽灵引用"(弱引用),导致内存泄漏。...