`
反求诸己
  • 浏览: 536878 次
  • 性别: Icon_minigender_1
  • 来自: 湖南娄底
社区版块
存档分类
最新评论

使用ThreadLocal实现事务的管理

阅读更多

在HibernateSessionFactory类中,我们可以仿照Session的管理方式来实现对Transaction事务的管理!

 

package com.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

 

public class HibernateSessionFactory {

 private static String CONFIG_FILE_LOCATION = "/com/hibernate/hibernate.cfg.xml";

 

 /**
  *
  * 程序在运行过程中会启动多个线程, threadLocal可以在单个线程内实现线程内部共享数据---使用单例模式
  *
  */
 private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();

 /**
  * 使用ThreadLocal实现事务的管理
  *
  */
 private static final ThreadLocal<Transaction> txThreadLocal = new ThreadLocal<Transaction>();

//配置文件节点<hibernate-configuration>对应读取的对象

 private static Configuration configuration = new Configuration();

//配置文件<session-factory>节点对应读取的对象
 private static org.hibernate.SessionFactory sessionFactory;

//配置文件hibernate.cfg.xml配置文件所在的路径
 private static String configFile = CONFIG_FILE_LOCATION;

 

//静态块,会早于构造函数执行

 static {
  try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
  } catch (Exception e) {
   System.err.println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
 }

 

 

 private HibernateSessionFactory() {
 }

 /**
  * Returns the ThreadLocal Session instance. Lazy initialize the
  * <code>SessionFactory</code> if needed.
  *
  * @return Session
  * @throws HibernateException
  */


 public static Session getSession() throws HibernateException {
  Session session = (Session) threadLocal.get();

  if (session == null || !session.isOpen()) {
   if (sessionFactory == null) {
    rebuildSessionFactory();
   }
   session = (sessionFactory != null) ? sessionFactory.openSession()
     : null;
   threadLocal.set(session);
  }

  return session;
 }

 public static void beginTransaction() throws HibernateException {
  //取得已经绑定的事务
  Transaction tx = (Transaction) txThreadLocal.get();
  
  //如果事务为空,或已经提交或已经回滚,则开启一个新的事务
  if (tx == null || tx.wasCommitted() || tx.wasRolledBack()) {
   tx = getSession().beginTransaction();
   //把事务绑定的本地线程中,供提交会回滚使用
   txThreadLocal.set(tx);
  }

 }

 

 public static void commitTransaction() throws HibernateException {
  //取得已经绑定的事务
  Transaction tx = (Transaction) txThreadLocal.get();
  //如果事务不等于空,并没有提交或回滚。则提交事务
  if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
   tx.commit();
  }
  //清空当前线程事务,确保下个操作取得新的事务
  txThreadLocal.set(null);

 }

 public static void rollbackTransaction() throws HibernateException {
  Transaction tx = (Transaction) txThreadLocal.get();

  if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {
   tx.rollback();
  }

 


  txThreadLocal.set(null);

 }

 

 

 /**
  * Rebuild hibernate session factory
  *
  */
 public static void rebuildSessionFactory() {
  try {
   configuration.configure(configFile);
   sessionFactory = configuration.buildSessionFactory();
  } catch (Exception e) {
   System.err.println("%%%% Error Creating SessionFactory %%%%");
   e.printStackTrace();
  }
 }

 /**
  * Close the single hibernate session instance.
  *
  * @throws HibernateException
  */
 public static void closeSession() throws HibernateException {
  Session session = (Session) threadLocal.get();
  threadLocal.set(null);

  if (session != null) {
   session.close();
  }
 }

 /**
  * return session factory
  *
  */
 public static org.hibernate.SessionFactory getSessionFactory() {
  return sessionFactory;
 }

 /**
  * return session factory
  *
  * session factory will be rebuilded in the next call
  */
 public static void setConfigFile(String configFile) {
  HibernateSessionFactory.configFile = configFile;
  sessionFactory = null;
 }

 /**
  * return hibernate configuration
  *
  */
 public static Configuration getConfiguration() {
  return configuration;
 }

}

分享到:
评论

相关推荐

    学生管理系统.rar

    使用三层架构改写我之前上传的代码 技术要点:1....使用事务管理器6.使用ThreadLocal管理Connection,实现线程单例 感兴趣的朋友可以下载,想要更具体了解可以参考我的“JDBC访问数据库操作详解系列”博客

    fat:基于springboot,zookeeper,redis分布式事务强一致性方案

    脂肪FAT,基于springboot,使用zookeeper,redis,spring异步,spring transactionManager的强一致性分布式事务解决方案框架介绍纯编码方式,强一致性。使用redis / zookeeper作为注册中心,代理事务的执行,使用...

    Spring.3.x企业应用开发实战(完整版).part2

    9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML配置声明式事务 9.5.1 一个将被实施事务增强的服务接口 9.5.2 使用原始的 TransactionProxyFactoryBean ...

    Spring3.x企业应用开发实战(完整版) part1

    9.3.2 Spring的事务管理器实现类 9.3.3 事务同步管理器 9.3.4 事务传播行为 9.4 编程式的事务管理 9.5 使用XML配置声明式事务 9.5.1 一个将被实施事务增强的服务接口 9.5.2 使用原始的 TransactionProxyFactoryBean ...

    经典JAVA.EE企业应用实战.基于WEBLOGIC_JBOSS的JSF_EJB3_JPA整合开发.pdf

    9.2.5 事务管理和异常处理 359 9.3 使用NetBeans开发EJB 359 9.3.1 使用NetBeans开发Session Bean 359 9.3.2 使用NetBeans开发MDB 362 9.4 本章小结 363 第10章 Java持久化API(JPA) 364 10.1 实体简介 365 10.1.1 ...

    Spring 2.0 开发参考手册

    9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring ...

    Spring中文帮助文档

    9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. 选择一...

    Spring API

    9.9.1. 对一个特定的 DataSource 使用了错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. 选择一种...

    spring chm文档

    9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring ...

    J2EE开发全程实录(JAVA项目开发)

    9.2.2 线程变量管理器的实现... 159 9.3 事务... 163 9.3.1 为什么需要事务... 163 9.3.2 什么是事务... 164 9.3.3 事务的边界划分... 164 9.3.4 声明型事务的属性... 166 9.3.5 事务的隔离... 168 9.3.6 事务的隔离...

    Spring-Reference_zh_CN(Spring中文参考手册)

    9.9.1. 对一个特定的 DataSource 使用错误的事务管理器 9.10. 更多的资源 10. DAO支持 10.1. 简介 10.2. 一致的异常层次 10.3. 一致的DAO支持抽象类 11. 使用JDBC进行数据访问 11.1. 简介 11.1.1. Spring JDBC包结构...

    免费分享 Java面试笔记 面试八股文 计算机网络基础

    MySQL:基础知识、存储引擎、日志、SQL优化、数据索引、锁、事务、高可用实现等;Spring:IOC、AOP、声明式事务、MVC等;Redis:持久化过程、高可用实现、缓存设计、应用场境等。 所有文档都是md格式,方便阅读,...

    疯狂JAVA讲义

    学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...

Global site tag (gtag.js) - Google Analytics