Session跟SessionFactory的线程安全与非安全
SessionFactory负责创建session,SessionFactory是线程安全的,多个并发线程可以同时访问一个
SessionFactory 并从中获取Session实例。 (SessionFactory源码大部分是final修饰的)

而Session并非线程安全,也就是说,如果多个线程同时使用一个Session实例进行数据存取,则将会导致 Session 数据存取逻辑混乱.因此创建的Session实例必须在本地存取空上运行,使之总与当前的线程相关。这里就需要用到ThreadLocal,在很多种Session 管理方案中都用到了它.ThreadLocal 是Java中一种较为特殊的线程绑定机制,通过ThreadLocal存取的数据, 总是与当前线程相关, 也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制,ThreadLocal并不是线程本地化的实现,而是线程局部变量。也就是说每个使用该变量的线程都必须为该变量提供一个副本,每个线程改变该变量的值仅仅是改变该副本的值,而不会影响其他线程的该变量的值,ThreadLocal是隔离多个线程的数据共享,不存在多个线程之间共享资源,因此不再需要对线程同步。(session实现类)

千万不要把session,或者 session里面的对象直接传递给业务层,因为你的业务处理一半时,同样可能出现session对象被改变的情况。有可能造成重要数据出现偏差。
举例:
session 对应三个产品,
事务里面循环了产品,并计算了总价格,
计算完毕,准备保存时,session变了,产品变成了4个。
此时开始保存。产品保存了4个,可总价格却还是3个的。
出现了数据不一致。
修改后的例子
session 对应三个产品
重新生成一个产品对象数组,把session数据复制过来,然后传递给业务层
事务里面循环计算总价格
计算完毕,此时session变了,但并不影响我们这个新的产品数组对象
保存,三个产品,价格也正确。
- HttpSession session = request.getSession();
- List<Product> list = session.getAttribute("productCart");
- List<Product> listNew = new ArrayList<Product>();
- Product pNew;
- for(Product p : list){
- pNew = new Product();
- pNew.setProductId(p.getProductId());
- // 其它的复制参数的语句
- listNew.add(pNew); // 保存到新的列表里面
- }
- myService.save(listNew); // 保存购物车数据到数据库,这个是安全的

总结:
有些线程安全问题是很隐蔽的,等你出了问题,很可能根本不认为会是那里出的问题。记住一点,Java里面的对象传递的是对象的引用,只要2个地方用了相同的引用,则其它地方的变动,这一面也会变动。
Session跟SessionFactory的线程安全与非安全的更多相关文章
- Hibernate学习---Configuration,Session,SessionFactory
上一节我们讲到了Hibernate的测试,并且给出了测试代码,刚开始看见这个测试代码的同学估计是一头雾水把,所以这一节我们来讲一下测试代码. 本节主要内容: Configuration Session ...
- JAVA中的线程安全与非线程安全
原文:http://blog.csdn.net/xiao__gui/article/details/8934832 ArrayList和Vector有什么区别?HashMap和HashTable有什么 ...
- 转:Windows下的PHP开发环境搭建——PHP线程安全与非线程安全、Apache版本选择,及详解五种运行模式。
原文来自于:http://www.ituring.com.cn/article/128439 Windows下的PHP开发环境搭建——PHP线程安全与非线程安全.Apache版本选择,及详解五种运行模 ...
- (转)PHP线程安全与非线程安全的区别:如何选择用哪一个?
PHP线程安全与非线程安全的区别:如何选择用哪一个? 很多时候,我们在做PHP环境配置的时候,很多人都是直接去乱下载PHP版本的,但是他不清楚:从2000年10月20日发布的第一个Windows版的P ...
- python基础-守护进程、守护线程、守护非守护并行
守护进程 1.守护子进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic pro ...
- Java线程安全和非线程安全
ArrayList是非线程安全的,Vector是线程安全的:HashMap是非线程安全的,HashTable是线程安全的:StringBuilder是非线程安全的,StringBuffer是线程安全的 ...
- 为什么JAVA虚拟机分为线程共享和非线程共享?
大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟 ...
- SessionFactory是线程安全的吗?Session是线程安全的吗?两个线程能共享一个Session吗?
(1)SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问.SessionFactory一般只会在启动的时候构建.对于应用程序,最好将Sess ...
- 第二次作业 单例模式的SessionFactory以及线程安全的session
单例模式的SessionFactory 在这个工具类Hibernate.java中写一个通过静态代码块生成唯一的SessionFactory,通过一个方法返回一个SessionFactory impo ...
随机推荐
- 说说&和&&的区别
&和&&都可以用作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true 时,整个运算结果才为true,否则,只要有一方为false,则结果为false. ...
- mybatis报错invalid types () or values ()解决方法
原因: Pojo类User没提供无参数构造方法, 加上该构造方法后,问题解决 ### Cause: org.apache.ibatis.reflection.ReflectionException ...
- struts2中错误There is no Action mapped for namespace [/] and action name [] associated with context path
1 There is no Action mapped for namespace [/] and action name [] associated with context path [/Stru ...
- php实现设计模式之 命令模式
<?php /* * 命令模式:(行为模式)将一个请求封装成一个对象(命令封装成对象),从而可以使用不同的请求对客户参数化(客户的不同请求,调不同的封装对象), * 对请求排序,或者记录请求日志 ...
- 从零开始学 Java - Spring AOP 拦截器的基本实现
一个程序猿在梦中解决的 Bug 没有人是不做梦的,在所有梦的排行中,白日梦最令人伤感.不知道身为程序猿的大家,有没有睡了一觉,然后在梦中把睡之前代码中怎么也搞不定的 Bug 给解决的经历?反正我是有过 ...
- Ajax的核心对象创建步骤
* Ajax具有核心对象 * XMLHttpRequest对象 * 如何创建XMLHttpRequest对象 function getXhr(){ // 声明XMLHttpRequest对象 var ...
- vue+ vue-router + webpack 踩坑之旅
说是踩坑之旅 其实是最近在思考一些问题 然后想实现方案的时候,就慢慢的查到这些方案 老司机可以忽略下面的内容了 1)起因 考虑到数据分离的问题 因为server是express搭的 自然少 ...
- [deviceone开发]-do_SegmentView和do_SlideView联动的示例
一.简介 示例展示do_SegmentView和do_SlideView联动的使用,这二个组件很常用,而且这个组合也非常常用,类似网易新闻的效果,上面滑动带动下面的slideview滑动,反过来也是. ...
- easyui弹出层在最顶层显示跳出iframe框架通用javascript代码
有时候我们用easyui在后台框架中弹框的时候,总是显示在框架页面里面而不是整个系统框架的上面,看着有些不太乐意. dialog = function (opts) { var query = par ...
- GoogleMap和高德地图最新的瓦片图地址是用什么加密或者压缩
https://mts1.googleapis.com/vt?pb=!1m4!1m3!1i13!2i2475!3i3029!2m3!1e0!2sm!3i293208756!3m9!2sen-US!3s ...