利用ThreadLocal模式管理Session

在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Session的频繁创建和销毁,对于提高系统的性能来说是非常重要的,以往是通过eclipse的插件来自动完成这些代码的,当然效果是不错的,但是总是觉得不爽(没有读懂那些冗长的代码),所以现在打算自己实现Session管理的代码。

我们知道Session是由SessionFactory负责创建的,而SessionFactory的实现是线程安全的,多个并发的线程可以同时访问一个SessionFactory并从中获取Session实例,那么Session是否是线程安全的呢?很遗憾,答案是否定的。Session中包含了数据库操作相关的状态信息,那么说如果多个线程同时使用一个Session实例进行CRUD,就很有可能导致数据存取的混乱,你能够想像那些你根本不能预测执行顺序的线程对你的一条记录进行操作的情形吗?

在Session的众多管理方案中,我们今天来认识一种名ThreadLocal模式的解决方案。

早在Java1.2推出之时,Java平台中就引入了一个新的支持:java.lang.ThreadLocal,给我们在编写多线程程序时提供了一种新的选择。ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用某变量的线程都提供一个该变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有一个该变量。

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在ThreadLocal类中有一个Map,用于存储每一个线程的变量的副本。比如下面的示例实现(为了简单,没有考虑集合的泛型):

public class ThreadLocal {
   private Map values = Collections.synchronizedMap(new HashMap());
   public Object get() {
   Thread currentThread = Thread.currentThread();
   Object result = values.get(currentThread);
    if(result == null&&!values.containsKey(currentThread)) {
     result = initialValue();
     values.put(currentThread, result);
      }
      return result;
     }
   public void set(Object newValue) {
    values.put(Thread.currentThread(), newValue);
    }
   public Object initialValue() {
    return null;
   }
  }

时间: 2025-01-26 18:57:49

利用ThreadLocal模式管理Session的相关文章

IBM PureApplication System利用虚拟系统模式管理拓扑

IBM PureApplication System http://www.aliyun.com/zixun/aggregation/12423.html">虚拟系统模式是从多年的基础架构-管理经验和最佳实践中凝结下来的精华.虚拟系统模式会根据各种中间件映像和运行时配置来封装可重复的拓扑定义:它们使您能够控制已部署的中间件.在本文中,作者向您介绍虚拟系统模式以及其在生态系统中的位置,描述它们的组件和功能,并提供了如何创建和使用虚拟系统模式的基础知识. IBM® PureSystems 产品

ThreadLocal模式

第4章 源头活水 -- Struts2中的设计模式  设计模式(Design pattern)是经过程序员反复实践后形成的一套代码设计经验的总结.设计模式随着编程语言的发展,也由最初的"编程惯例"逐步发展成为被反复使用.并为绝大多数程序员所知晓的.完善的理论体系.我们使用设计模式(Design pattern)的初衷,是使代码的重用度提高.让代码能够更容易被别人理解以及保证代码的可靠性.毫无疑问,在程序中使用设计模式无论是对于程序员自身还是对于应用程序都是双赢的结果.正确地使用设计模式

Windows7中利用库来管理文件

在Windows7 操作系统中,提供了另外一种全新的文件管理方式即通过库来管理文件.如下图,就是库 管理界面的一个截图. 插图:Windows7中利用库来管理文件 这是Windows7操作系统中新推出的一个有效的文件管理模式.其看起来来跟文件夹比较相似.但是又 有很大的不同.笔者在这篇文章中,就对这个库文件管理方式做一个比较深层次的分析与测试,帮助大家 了解这个新功能. 一.跟普通文件夹的异同. 从上面的界面中,我们可以看到库好像跟传统的文件夹比较相像.确实,从某个角度来讲,库跟文件 夹确实有很

Win8.1使用技巧之电源模式管理优化指南

电源优化管理有何优点? 电源管理的优化,能维护电脑稳定运行,降低设备各部件功耗,节省用电开销,延长设备电池及各部件的使用寿命,使设备能够长久保持稳定.低能耗.高性能的运 行状态.由于以往的Windows系统,提供台式机的电源控制较少,因此用户只能极其有限地管理计算机电源,如今Windows8.1系统针对笔记本而设 计,专门优化了对电池.电源的控制功能,使用户以更多样.细致.全面的方式,管理计算机电源,从底层降低设备各部件能耗,延长硬件寿命. Win8.1有四种电源管理模式 通过Win8.1"控制

Gartner:到2020年,90%的组织将利用混合云管理基础设施

根据分析公司Gartner的最新预测,到2020年,90%的组织将利用混合云管理基础设施. 报告指出,预计到2017年,基础设施服务将成为混合云基础设施服务,还有云计算.工业化服务增长,以及传统数据中心外包下降的主要原因. Gartner认为,去年全球传统数据中心外包以及基础设施公用事业(IUS)占全球数据中心服务市场49%的比重,售价为1540亿美元.到2020年,将增长到2280亿美元,但云计算基础设施服务(IaaS)和托管收费会使传统基数下降35%,整体市场规模有所扩大,去年为754.6亿

模式应用 - 利用工厂模式制作自己的"小程序测试工厂"

在平时开发程序的过程中,自己经常会写一些控制台小程序进行测试某个功能,事后我们会寻找这些小程序,如果不仔细管理,经常会找不到.由于每个控制台小程序都有自己独立的 Main方法,所以我们不能把他们都放在一个Solution里面,这样在编译整个项目的时候会通不过,但是又不想为每个小程序都单独建立一个项目,这样又太浪费,因为每个都是一个非常简单的代码文件.于是我想到了利用工厂模式,我是这样做的: 首先创建一个ITestCase接口,它有一个Run方法. namespace SharpTrainer{ 

win8系统利用兼容模式安装win7驱动的方法

  一些用户在win8.1系统下安某驱动时,出现很驱动无法正常安装的问题,对于这种该问题用户可尝试兼容模式来安装win7驱动,这样能够让我们win8系统下无法使用的驱动程序被正常安装使用,下面我们就详细介绍下如何在win8系统下安装win7的方法吧! win8系统下安装win7驱动的方法 1.首先得到For Win7的驱动程序,位数版本要对到,64位和32位不同; 2.然后找到主安装程序,一般为 Setup.exe,我们右键打开该程序属性,在兼容性选项卡下,勾选以兼容性模式运行,选择 Win7

浅谈利用元数管理平台自动化管理指标的方法

目录: 一.企业指标管理的三个核心问题 二.解决指标管理的问题,需要从三个方面入手 三.通过元数据管理平台,实现指标管理在技术上的自动化 四.总结 本文讲的是浅谈利用元数管理平台自动化管理指标的方法,指标直接反映企业的生产运营状况,为企业决策提供数据支撑.随着国家大数据战略与企业数字化转型的驱动,指标的作用越来越重要,指标管理上的诸多痛点让全企业统一的指标管理成为普遍需求.但要想把指标管理好并不容易,不仅需要科学合理的方法,还需要技术的强力支撑. 指标作为一种业务元数据,与企业元数据有着千丝万缕

谷歌浏览器:利用Metro模式推出ChromeOS界面

硅谷网讯 在经过长时间测试后,谷歌(微博)日前推出了Chrome最新的32版本.最值得注意的是,针对Windows8用户,Chrome浏览器利用Metro模式推出了类似ChromeOS的界面,和Chromebook看到的十分类似,媒体称,谷歌在微软的Windows中,建立了一个与对手竞争的"国中之国". 随着主要的电脑大厂商纷纷推出Chromebook,ChromeOS的市场份额正在攀升.ChromeOS对传统的Windows操作系统提出了挑战,不仅启动速度更快,而且永远自动更新,另外