设为首页 收藏本站
查看: 1053|回复: 0

[经验分享] hibernate_SessionFactory_getCurrentSession_JTA简介

[复制链接]

尚未签到

发表于 2017-2-18 14:08:57 | 显示全部楼层 |阅读模式
  JTA:java transaction  api
      java里所规定的一种管理事务的API
  在另一篇播客我写到了,SessionFactory需要关注两个方法,
  即:  openSession    和 getCurrentSession
  i.   openSession 每次都是新的,需要close
  ii.  getCurrentSession 从上下文找,如果有,用旧的,如果没有,建新的
  1,用途,界定事务边界
  2,事务提交自动close
  3,跟current_session_context_class (JTA、thread) 有关系
  a)thread 使用 connection
  下面就说说什么是上下文?
  什么是上下文,是在配置文件hibernate.cfg.xml里指定的:
  current_session_context_class:当前的session运行的环境的上下文。



<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
  查hibernate的文档:
DSC0000.png

  取值有四种:
  1,jta  *(重点说这个)
  2,thread  ***最常用
  从当前线程里找,看有没有一个对象是 session,如果有,就用已经存在的,如果没有,就创建新的。
  3,managed  极少用,可以忘了。
  在J2ee里,EJB 的 Application Server  应用服务器,用来手工管理事务用managed,用的极少,可以忘了。
  4,customer.class   没必要,可以忘了
  自定义的class来管理currentSession。
  先说结论:
  事务有两种:
  1,依赖于数据库本身的,简称Connection事务,只针对一个数据库。
  2,JTA事务:分布式
  我们这里指定的东西主要和事务有关系,如果指定的是thread,这时使用Connection(数据库连接)来帮你管理事务。connection.setAutoCommit(false),执行一系列操作,当catch到异常,connection.rollback(),没有异常,commit。但是有一种事务使用一个Connection是管理不了的,例:
  处理订单:
  DB1是产品数据库,DB2是财务的数据库。这两个数据库假设一个是mysql,一个是oracle,一个在北京,一个在上海。
  要求客户端请求处理一个订单,往DB1里添加订单   (操作一),同时,向财务数据库DB2里记录财务信息(操作二),这两个操作必须在同一个事务里。
  这时如果只有一个Connection,这两个操作就不能在一个事务里,目前的事务依赖于数据库本身的能力,还不能保证操作二出问题时,操作一也得回滚,保证不了。此时只有一个Connection是不行的。
DSC0001.png

  这时需要一个专门的事务管理器,因为这种情况只依赖于数据库本身的Connection来管理事务是不行的
  办法:
  有一个Transaction Manager管理分布式事务(分布在多台不同的数据库server上)。
  此时,先让Transaction Manager记录好操作一,操作二,,,做完操作,然后让Transaction Manager提交。Transaction Manager帮你管理着你的各个操作,假如第二个操作出了错,就要求第一个数据库的操作也回滚,这种能力的实现需要具体的数据库的驱动来实现,这时的驱动和我们在同一台服务器上做操作用的驱动不一样,是另外一种驱动,XA驱动 (J2ee要求的)。
  Transaction Manager由Application Server(应用服务器)中间件来提供。tomcat本身目前不具备这个能力。(借助Spring可以实现)
  Jboss支持,weblogic支持。这种事务就是JTA事务。
DSC0002.png

  所以,只要你用getCurrentSession来得到session,必须要设定session运行的上下文。
  如果在我们一般项目的配置里把上下文配置改为jta,或者不写



<property name="current_session_context_class">jta</property>
  都会报错。因为Transaction  Manager是由中间件,由application  server应用服务器来提供,tomcat本身不具备这能力。如果你不设,就是被设置session运行的上下文,他就不知道去哪里找。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-343964-1-1.html 上篇帖子: [设计篇]02.偶尔一阅-轻量级框架与重量级框架[转载] 下篇帖子: javarebel热部署 (转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表