当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:13:00  来源:本站整理

Hibernate的事件和并发(一)[Java编程]

赞助商链接



  本文“Hibernate的事件和并发(一)[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

Hibernate的事件和并发掌握很简单掌握.Hibernate直接利用JDBC衔接和JTA资源,不增添任何附加锁定 行为.我们激烈举荐你花点时间理解JDBC编程,ANSI SQL查询语言和你利用 的数据库系统的事件断绝标准.Hibernate只增添自动版本管理,而不会锁 定内存中的对象,也不会改变数据库事件的断绝级别.基本上,利用 Hibernate就仿佛直接利用JDBC(大概JTA/CMT)来拜候你的数据库资源.

除了自动版本管理,针对行级悲观锁定,Hibernate也供应了帮助的API,它利用了 SELECT FOR UPDATE的SQL语法.本章背面会谈论这个API.

我们从Configuration层、SessionFactory层, 和 Session层开始谈论Hibernate的并行掌握、数据库事件和利用 程序的长事件.

12.1.Session和事件范围(transaction scopes)

一个SessionFactory对象的成立代价很高贵,它是线程安全的对象,它被计划成可以 为全部的利用程序线程所同享.它只成立一次,普通是在利用程序启动的时刻,由一个 Configuraion的实例来成立.

一个Session的对象是轻型的,非线程安全的,关于单个业务进程,单个的 工作单元而言,它只被利用一次,然后就丢弃.只有在需求的时刻,Session 才会获得一个JDBC的Connection(或一个Datasource) 对象.所以你可以安心的翻开和关闭Session,乃至当你并不肯定一个特定的请 求能否需求数据拜候时,你也可以这样做.(一旦你实现下面提到的利用了恳求拦阻的情势,这就 变得很重要了.

此外我们还要考虑数据库事件.数据库事件应当尽大概的短,降低数据库锁定造成的资源争用. 数据库长事件会招致你的利用程序无法扩大到高的并发负载.

一个操作单元(Unit of work)的范围是多大?单个的Hibernate Session能超越多个 数据库事件吗?还是一个Session的作用范围对应一个数据库事件的范围?应当什么时刻翻开 Session,什么时刻关闭Session?,你又若何划分数据库事件的边界呢?

12.1.1.操作单元(Unit of work)

首先,别再用session-per-operation这种反情势了,也就是说,在单个线程中, 不要因为一次简单的数据库调用,就翻开和关闭一次Session!数据库事件也是如此. 利用程序中的数据库调用是按照筹划好的次序,分组为原子的操作单元.(注意,这也意味着,利用程 序中,在单个的SQL语句发送之后,自动事件提交(auto-commit)情势失效了.这种情势专门为SQL掌握台操作计划的. Hibernate禁止当即自动事件提交情势,大概盼望利用服务器禁止当即自动事件提交情势.)

在多用户的client/server利用程序中,最常用的情势是 每个恳求一个会话(session-per-request). 在这种情势下,来自客户端的恳求被发送到服务器端(即Hibernate长期化层运行的地方),一 个新的Hibernate Session被翻开,并且履行这个操作单元中全部的数据库操作. 一旦操作完成(同时发送到客户端的呼应也预备就绪),session被同步,然后关闭.你也可以利用单 个数据库事件来处理客户端恳求,在你翻开Session之后启动事件,在你关闭 Session之前提交事件.会话和恳求之间的关系是一对一的关系,这种情势对 于大大都利用程序来说是很棒的.

真正的挑衅在于若何去实现这种情势:不但Session和事件必须被精确的开始和完毕, 并且他们也必须能被数据拜候操作拜候.用拦阻器来实现操作单元的划分,该拦阻器在客户端恳求到达服 务器端的时刻开始,在服务器端发送呼应(即,ServletFilter)之前完毕.我们举荐 利用一个ThreadLocal 变量,把 Session绑定处处理客户端恳求的线 程上去.这种方法可以让运行在该线程上的全部程序代码轻松的拜候Session(就像拜候一 个静态变量那样).你也可以在一个ThreadLocal 变量中保持事件上下文环境,不过这依靠 于你所挑选的数据库事件划分机制.这种实现情势被称之为 ThreadLocal Session和 Open Session in View.你可以很简单的扩大本文前面章节展示的 HibernateUtil 帮助类来实现这种情势.当然,你必须找到一种实现拦阻器的办法,并 且可以把拦阻器集成到你的利用环境中.请参考Hibernate网站上面的提醒和例子.


  以上是“Hibernate的事件和并发(一)[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 在Hibernate里面动态切换SChema实现访谒差别的数据库的几种办法
  • Hibernate 3新增XML关系长期性介绍
  • Hibernate配置文件在单元测试中的操纵
  • 在Hibernate中动态切换Schema
  • hibernate annoation (八 关联映射)
  • hibernate annoation (九 cascading)
  • <b>hibernate annoation (十 映射查询)</b>
  • hibernate annoation(十一 缓存Ehcache 采纳annoation)
  • Hibernate:操作配置文件生成数据库
  • hibernate annoation (一 加载)
  • hibernate annoation (二 成立表)
  • <b>hibernate annoation (三 id生成器)</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .