在 HibernateUtil 中使用的线程安全的实现方法和所用知道的一点点说明

ThreadLocal来存储Session,以便实现Session any where 1.Application对象      多个用户共享的应用级别的作用域,在服务器端,相比前两者,这个存在时间是最长的,只有当关闭服务器的时候才死亡!所以他可以活很长时间。     Application用于保存所有用户的公共的数据信息,如果使用Application对象,一个需要考虑的问题是任何写操作都要在Application_OnStart事件(global.asax)中完成.尽管使用... 阅读详情
什么是ThreadLocal?
顾名思义它是local variable(线程局部变量)。它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。
使用场景
  1. To keep state with a thread (user-id, transaction-id, logging-id)
  2. To cache objects which you need frequently
ThreadLocal类
它主要由四个方法组成initialValue(),get(),set(T),remove(),其中值得注意的是initialValue(),该方法是一个protected的方法,显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这个方法是一个延迟调用方法,在一个线程第1次调用get()或者set(Object)时才执行,并且仅执行1次。ThreadLocal中的确实实现直接返回一个null:
ThreadLocal的原理
ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现:
public class ThreadLocal
{
private Map values = Collections.synchronizedMap(new HashMap());
public Object get()
{
Thread curThread = Thread.currentThread();
Object o = values.get(curThread);
if (o == null && !values.containsKey(curThread))
{
o = initialValue();
values.put(curThread, o);
}
return o;
}
 public void set(Object newValue)
{
values.put(Thread.currentThread(), newValue);
}
 public Object initialValue()
{
return null;
}
}
ThreadLocal 的使用
使用方法一:
Hibernate的文档时看到了关于使ThreadLocal管理多线程访问的部分。具体代码如下

1.   public static final ThreadLocal session = new ThreadLocal();
2.   public static Session currentSession() {
3.       Session s = (Session)session.get();
4.       //open a new session,if this session has none
5.    if(s == null){
6.       s = sessionFactory.openSession();
7.       session.set(s);
8.    }
       return s;
9. }

我们逐行分析
1。 初始化一个ThreadLocal对象,ThreadLocal有三个成员方法 get()、set()、initialvalue()。
     如果不初始化initialvalue,则initialvalue返回null。
3。 session的get根据当前线程返回其对应的线程内部变量,也就是我们需要的net.sf.hibernate.Session(相当于对应每个数据库连接).多线程情况下共享数据库链接是不安全的。ThreadLocal保证了每个线程都有自己的s(数据库连接)。
5。如果是该线程初次访问,自然,s(数据库连接)会是null,接着创建一个Session,具体就是行6。
6。创建一个数据库连接实例 s
7。保存该数据库连接s到ThreadLocal中。
8。如果当前线程已经访问过数据库了,则从session中get()就可以获取该线程上次获取过的连接实例
别再手动更新Excel了!用Jira看板管理你的个人项目(附保姆级配置流程) 本文详细介绍了如何利用Jira看板替代Excel进行个人项目管理,提供从注册到配置的保姆级教程。通过极简看板模式、自动化规则和数据分析功能,帮助用户实现任务可视化、协作高效化和提醒自动化,大幅提升个人工作效率。特别适合需要管理复杂个人项目的用户。 阅读详情

相关推荐

保姆级教程:在Ubuntu 20.04上搞定pybind11,解决‘找不到头文件’的坑

本文提供了一份详细的Ubuntu 20.04下pybind11配置指南,重点解决常见的'找不到头文件'问题。从环境准备、安装策略到三种专业解决方案(修改CMakeLists.txt、环境变量方案、绝对路径包含),帮助开发者高效搭建C++与Python的桥梁。

weixin_28829325的博客 284

Java通俗易懂30天 第19天:多线程(下)

文章目录 文章目录文章目录第8章 多线程线程的生命周期线程的同步同步代码块处理实现Runnable的线程安全问题同步代码块处理继承Thread类的线程安全问题同步方法处理实现Runnable的线程安全问题同步方法处理继承Thread类的线程安全问题线程安全的单例模式之懒汉式死锁的问题Lock锁方式解决线程安全问题线程的通信sleep()和wait()的异同经典例题:生产者/消费者问题JDK5.0新增线程创建方式创建多线程的方式三:实现Callable接口使用线程池的好处创建多线程的方式四:使用线程池 ..

程序员小刘 1651

Oracle19c SYSAUX表空间爆满?手把手教你清理SM/ADVISOR和AUDSYS占用(附完整SQL)

本文详细解析了Oracle19c中SYSAUX表空间爆满的常见原因及解决方案,重点针对SM/ADVISOR和AUDSYS组件的空间占用问题提供了完整的SQL清理脚本。通过诊断查询、空间清理和预防性维护策略,帮助DBA有效管理SYSAUX表空间,确保数据库稳定运行。

weixin_28338005的博客 237

ThreadLocal VS session 及ThreadLocal用法

session对象的管理类使用的session类 好多个session对象 每一个对象一个人使用。

m0_53222768的博客 2078

Python爬取天天基金网历史数据

前言 最近开始学习基金????,感觉需要收集一些数据统计分析才靠谱????毕竟给A股交学费的感觉可不好受???? 网上有很多公开的数据,我这里选择的是天天基金网进行爬取 页面分析 接口我分析过了,有些验证不太好获取数据,所以直接从html提取 在天天基金网中随便选择一款基金,然后点击进入历史数据页面 容易定位出日增长率的css选择器 还有翻页按钮 程序编写 使用selenium打开chrome浏览器进行爬取,全代码如下 from selenium import webdriver from sel

JiajunBernoulli的博客 2950

Dify + mem0插件实战:如何让AI记住你的饮食习惯(附完整代码)

本文通过Dify平台与mem0插件实战,详细演示了如何为AI助手构建长期记忆系统,使其能记住并理解用户的复杂饮食习惯(如过敏源、饮食偏好)。文章提供了完整的工作流配置与Python代码示例,帮助开发者实现跨会话的个性化饮食建议,解决AI对话中的“健忘”问题。

lg888的博客 1095

ThreadLocal

ThreadLocal ThreadLocal threadlocal使用方法很简单 static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>(); sThreadLocal.set() sThreadLocal.get() threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据,官方解释如下。 大致意思就是ThreadLocal提供了线程内存储变量的能

D1842501760的博客 336

Flannel,Calico 和 Cilium 之间有哪些优缺点和差别?

例如,在一个多租户的容器集群中,可以通过Calico为不同租户的容器设置精细的访问控制策略,确保每个租户的资源安全。例如,在设置复杂的网络策略和BGP路由时,需要对网络概念和Calico的配置语法有比较深入的了解。它可以根据容器的标签、服务等信息来定义访问规则,并且可以实现更加细粒度的网络安全策略,如HTTP层的策略。性能损耗:在overlay网络模式下(如VXLAN),由于需要对数据包进行额外的封装和解封装操作,会带来一定的性能损耗,尤其是在高流量的场景下,这种性能损耗可能会更加明显。

chinansa的博客 1529

浅谈ThreadLocal

1. ThreadLocal简介 ThreadLocal叫做线程变量,意思是ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。 ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意: 因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thr

大家好,我是千楼,全栈开发工程师,分享日常学习和工作,记录成长~~~ 5296

从零到一:QT for OpenHarmony 开发环境实战搭建与踩坑指南

本文是一份详尽的QT for OpenHarmony开发环境搭建实战指南。文章手把手教你如何在Windows和macOS系统上,从环境准备、核心工具(DevEco Studio与社区版QT SDK)安装配置,到创建首个QT Quick项目、解决构建部署中的常见问题,最终实现应用在OpenHarmony设备上运行。内容涵盖关键配置修改、资源管理及深度踩坑经验,旨在帮助开发者高效开启跨平台开发之旅。

weixin_29190573的博客 325

Unreal 从入门到进阶 之 如何实现Pixel Streaming

Unreal Engine 5 (UE5) 的 Pixel Streaming 是一项基于云端的实时流媒体技术,允许将 UE5 应用的高质量图形渲染结果通过 WebRTC 协议传输到用户的浏览器或轻量级设备,同时将用户输入(如鼠标、键盘、触控)回传到服务器处理。UE的插件相对比较好用,但是就是环境下载总是失败。希望这篇文章对你有所帮助。

TxNet 1369

浅谈:Hibernate中HibernateUtil工具类

浅谈:Hibernate工具类HibernateUtil

VipMao的博客 2万+

python实现下载和离线安装包环境

导出当前电脑python安装的所有包列表requirement.txt。

m0_60352504的博客 1676

HibernateUtil范例

HibernateUtil往往是用来生成SessionFactory以及getSession与closeSession的,主要是几个静态方法。 一、使用ThreadLocal隔离执行所使用的数据,避开Session多线程之间数据共享问题,主要是几个静态方法: import org.apache.commons.logging.Log;import org.apache.commons.l...

腾飞FLY 144

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Hibernate的工具类HibernateUtil

Hibernate的工具类HibernateUtil 编写Hibernate的工具类,是为了减少代码量,提高代码重用性! Hibernate中每个主程序都需要加载hibernate.cfg.xml文件、创建SessionFactory对象、创建Session对象、关闭session。这些都是固定化的步骤,所以我们对其进行封装。 可以根据自己的项目需求改写自己的工具类,我按照自己的要求编写的自己的工具类,有一些代码片段是借鉴了别人博客里的内容! 1、使用静态方法 2、SessionFactory对象只

qq_46031523的博客 818

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

我的HibernateUtil帮助类

代码: package cn.jbit.common; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; public class HibernateUtil { //单例化HibernateUtil ...

凝望星空 226

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

HibernateUtil

import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuild...

diannao5430的博客 114

HibernateUtil工具

HibernateUtil import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class HibernateUtil { private static SessionFactory factory; ...

qq_44707265的博客 204

Hibernate框架中的HibernateUtil

对于刚学习三层框架的人来说,每一个配置文件和每一个类,以及功能来说都很新鲜,时常就忘记了相关类的功能。 在这里建议编程就是要多加练习,才能熟能生巧。 这里说一下HibernateUtil类,在使用Hibernate的前提是需要去下载Hibernate项目,然后在lib文件夹下面把所有的. jar 包 COPY到你项目的lib文件夹下。 什么是HibernateUtil类,或者是说有什么功能

杨鑫newlife的专栏 4244

HibernateUtil升级

一 需求 对HibernateUtil工具类进行升级,使得满足查询、分页查询、插入、更新、修改功能。 二 代码 package com.cakin.util; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFact

实践求真知 255

maven学习问题--HibernateUtil不能初始化

此文章只是记录自己学习的过程,而且最后也没搞明白是怎么回事,只是问题解决了。        在学习的孔浩老师的maven视频(在eclipse中搭建简单的项目)时,看完视频后我照着敲了一遍。        我把搭建这个easy的demo分为以下步骤:              1、创建maven项目,确定groupId, artifactId,version              2、

蓝色的风 1700

hibernate工具类HibernateUtil详解

1.为什么要用hibernateUtil这个类,先看这段代码: //加载配置文件信息默认为hiberna.cfg.xml,如果不是的话那么就在config()方法里面去解析他 Configuration config = new Configuration(); config.config(); //创建工厂 SessionFa...

alexhill2009的博客 403

Hibernate 3和4的HibernateUtil

ttp://maven.apache.org/xsd/maven-4.0.0.xsd"&gt; &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupId&gt;org.fool.hibernate&lt;/groupId&gt; &lt;artifactId&gt;hibernate3.6&lt;/artifactId&gt

Faith, Simpleness, Transparency, Innovation 178

Hibernate4环境搭建和HibernateUtil

本专题要讲述,Hibernate环境的搭建,本例使用Hibernate版本为:hibernate-release-4.3.8.Final。本例jar文件,提供下载路径为: http://download.youkuaiyun.com/detail/ma_hoking/8380545。需要的读者,可以自行下载使用。 将下载后的文件hibernate-release-4.3.8.Final.zip解压缩,hi

HOKING的专栏 3144

HibernateUtil详解

\首先,我们先来看一段代码,传统的Hibernate获得Session进行CRUD的操作:// 1.创建Configuration引用 Configuration configuration = new Configuration(); // 2.创建SessionFactory,SessionFactory是一个重量级对象,所谓重量级对象会很吃计算机的内存,因为该对象要完成对映射文件的管

wushiling123的专栏 2238
上一篇: 这里的冬天从此开始下雪
下一篇: 使用模板模式简化DAO操作Hibernate
凄凄迷人
博客等级 码龄21年 58粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值