`
wangqisen
  • 浏览: 47786 次
文章分类
社区版块
存档分类
最新评论

hibernate中session的线程安全问题

 
阅读更多
Hibernate的基本特征是完成面向对象的程序设计语言到关系数据库的映射,在Hibernate中使用持久化对象PO(Persistent Object)完成持久化操作,对PO的操作必须在Session管理下才能同步到数据库,
但是这里的Session并非指HttpSession,可以理解为基于JDBC的Connnection,Session是 Hibernate运作的中心,
对象的生命周期、事务的管理、数据库的存取都与Session息息相关,首先,我们需要知道,
SessionFactory负责创建Session,SessionFactory是线程安全的,多个并发线程可以同时访问一个
SessionFactory 并从中获取Session实例。

而Session并非线程安全,也就是说,如果多个线程同时使用一个Session实例进行数据存取,
则将会导致 Session 数据存取逻辑混乱.因此创建的Session实例必须在本地存取空上运行,
使之总与当前的线程相关。这里就需要用到ThreadLocal,在很多种Session 管理方案中都用到了它.

ThreadLocal 是Java中一种较为特殊的线程绑定机制,通过ThreadLocal存取的数据,
总是与当前线程相关,
也就是说,JVM 为每个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的并发访问问题提供了一种隔离机制,ThreadLocal并不是线程本地化的实现,而是线程局部变量。也就是说每个使用该变量的线程都必须为该变量提供一个副本,每个线程改变该变量的值仅仅是改变该副本的值,而不会影响其他线程的该变量的值,ThreadLocal是隔离多个线程的数据共享,不存在多个线程之间共享资源,因此不再需要对线程同步。
分享到:
评论

相关推荐

    org.hibernate.HibernateException: No Hibernate Session bound to thread

    No Hibernate Session bound to thread,没有绑定线程解决办法,找了好久才找到的

    day36 11-Hibernate中的事务:当前线程中的session

    NULL 博文链接:https://364232252.iteye.com/blog/2369000

    Hibernate体系结构的概要图

    但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSession对象称为用户session。 ...

    hibernated的线程同步问题

    hibernate数据的并发控制,及hibernate中的session.get()与session.load()方法异同

    hibernate操作数据库笔记

    注:由于SessionFactory是重量级对象,很耗资源,所以在获取SessionFactory对象时最好用单例模式获取,以确保一个应用中只有一个SessionFactory对象存在和线程安全,由于Session对象 是非线程安全的(尽管创建一个...

    Hibernate用ThreadLocal模式(线程局部变量模式)管理Session

    今天小编就为大家分享一篇关于Hibernate用ThreadLocal模式(线程局部变量模式)管理Session,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    Hibernate实战(第2版 中文高清版)

     10.1.2 Hibernate应用程序中的事务   10.1.3 使用Java Persistence的事务   10.2 控制并发访问   10.2.1 理解数据库级并发   10.2.2 乐观并发控制   10.2.3 获得额外的隔离性保证   10.3 非事务数据...

    hibernate 对事务并发处理

    然后,在程序中通过 sessionFactory.getCurrentSession() 获得线程绑定 Session 对象。 二级缓存 Hibernate 的二级缓存可以将数据库或者硬盘数据,保存在内存中,减少数据库访问次数,提高性能。

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    hibernate精华教程

    1)不是线程安全的,因此在设计软件架构时,应该避免多个线程共享同一个Session实例。 2)Session实例是轻量级的,所谓轻量级,是指它的创建和销毁不需要消耗太多的资源。这意味着在程序中可以经常创建或销毁Session...

    多线程SSH爆破

    ssh环境,通过action触发一个多线程任务,每个任务调用一个继承HibernateDaoSupport的service的方法,现在要每个线程都绑定一个新的hibernate session

    hibernate 教程

    在同一Session中更新 9.4.2. 更新从session脱离的对象 9.4.3. 把与Session脱离的对象重新绑定 9.5. 删除持久化对象 9.6. 同步(Flush) 9.7. 结束一个Session 9.7.1. 同步(Flush) Session ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     23.1.1 Session对象的生命周期与本地线程绑定  23.1.2 Session对象的生命周期与JTA事务绑定  23.2 实现对话  23.2.1 使用游离对象  23.2.2 使用手工清理缓存模式下的Session  23.3 小结  23.4 思考题 第24章...

    hibernate

    在同一Session中更新 9.4.2. 更新从session脱离的对象 9.4.3. 把与Session脱离的对象重新绑定 9.5. 删除持久化对象 9.6. 同步(Flush) 9.7. 结束一个Session 9.7.1. 同步(Flush) Session ...

    jsp Hibernate 函数简介

    1、Configuration/SessionFactory/Session Configuration实例代表了一个应用程序中Java类型 到SQL数据库映射的完整集合. Configuration被用来构建一个(不可变的 (immutable))SessionFactory. SessionFactory是线程...

    JAVAEE试题(含答案).pdf

    如果需要在同一线程中,保证使用同一个 Session 则使用 getCurrentSession(),如果在一个线程中,需要使用不同的 Session,则使用 openSession()。 填空题 1. MVC 的三个组成部分分别是:模型、视图、控制器。 2. ...

    网站设计方案(完整版).doc

    但需要注意的是Session对象是非线程安全的。同时 ,Hibernate的session不同于JSP应用中的HttpSession。这里当使用session这个术语时 ,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session。 ...

Global site tag (gtag.js) - Google Analytics