threadlocal threadlocalMap 在hibernate spring中的应用

2024-02-29 19:38

本文主要是介绍threadlocal threadlocalMap 在hibernate spring中的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

之前看资料,总说spring hibernate 是通过threadlocal来实现并发。
更详细的就是session的产生是由threadlocal来实现并发控制,保证多线程安全。
但是只看讲解,真是不理解,时时如鲠在喉。今狠下心看了下源码,终于自认为搞明白了。
实际上[color=red]就是一个threadlocal实例变量,这个类有get,set方法,且这个方法的特殊之处就在于能得到或设定线程的静态变量threadlocalMap的值,且threadlocalMap的key为该threadlocal实例变量![/color]


根据个人理解详细如下:
sessionFactory 由spring的LocalSessionFactoryBean来产生。

在LocalSessionFactoryBean中,通过一系列的方法调用,最终会产生一个SessionFactoryImpl实例,这个实例就是spring容器管理的sessionFactory 。

而[color=red]每一个HibernateTemplate都会持有这[b]同一个[/b]sessionFactory 的引用[/color]。

当调用HibernateTemplate.getSession方法时,实际上是调用的SessionFactoryImpl的currentSessionContext的getCurrentSession()方法。在这个方法中会[color=red]通过currentSessionContext所持有的ThreadLocal实例对象,去查询当前线程的静态变量ThreadLocalMap中是否保存有以currentSessionContext所持有的ThreadLocal实例对象为key对应的Map,且Map中有以当前sessionFactory 为key对应的session[/color],有则用之,无则新建session并保存。

最终,一个thread的ThreadLocalMap状态如下
thread_1
ThreadLocalMap
table[Entiry](是一个数组 Entity[] table)
table[i]为 <ThreadLocal实例对象, Map<sessionfactory, session > >

[color=red]其实就是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。[/color]
这样,当不同的客户请求时,服务器负责产生不同的thread来处理客户的request,对于不同的thread,由[color=red]同一个ThreadLocal实例变量来负责为不同的thread[/color]绑定对应的session。同一线程对应同一客户,就能保证具有同一个session。

这篇关于threadlocal threadlocalMap 在hibernate spring中的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/759855

相关文章

Spring IOC的三种实现方式详解

《SpringIOC的三种实现方式详解》:本文主要介绍SpringIOC的三种实现方式,在Spring框架中,IOC通过依赖注入来实现,而依赖注入主要有三种实现方式,构造器注入、Setter注入... 目录1. 构造器注入(Cons编程tructor Injection)2. Setter注入(Setter

Java function函数式接口的使用方法与实例

《Javafunction函数式接口的使用方法与实例》:本文主要介绍Javafunction函数式接口的使用方法与实例,函数式接口如一支未完成的诗篇,用Lambda表达式作韵脚,将代码的机械美感... 目录引言-当代码遇见诗性一、函数式接口的生物学解构1.1 函数式接口的基因密码1.2 六大核心接口的形态学

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

java中的HashSet与 == 和 equals的区别示例解析

《java中的HashSet与==和equals的区别示例解析》HashSet是Java中基于哈希表实现的集合类,特点包括:元素唯一、无序和可包含null,本文给大家介绍java中的HashSe... 目录什么是HashSetHashSet 的主要特点是HashSet 的常用方法hasSet存储为啥是无序的

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

JSON字符串转成java的Map对象详细步骤

《JSON字符串转成java的Map对象详细步骤》:本文主要介绍如何将JSON字符串转换为Java对象的步骤,包括定义Element类、使用Jackson库解析JSON和添加依赖,文中通过代码介绍... 目录步骤 1: 定义 Element 类步骤 2: 使用 Jackson 库解析 jsON步骤 3: 添