`
fengzl
  • 浏览: 216737 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

Hibernate本地事务实现 ThreadLocal

阅读更多
调用HibernateSessionFactory 的getSession()方法,得到当前线程内的session对象.用完session后,不要关闭session,而且,每次在用session进行添加和修改操作时,也不需要启动事务.
package com.cs_oj.data.dao;

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


public class HibernateSessionFactory {

    /** 
     * Location of hibernate.cfg.xml file.
     * Location should be on the classpath as Hibernate uses 
     * #resourceAsStream style lookup for its configuration file. 
     * The default classpath location of the hibernate config file is 
     * in the default package. Use #setConfigFile() to update 
     * the location of the configuration file for the current session.   
     */
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
    private static Configuration configuration = new Configuration().configure();
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;

    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 = threadLocal.get();

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

        return session;
    }

    /**
     * Rebuild hibernate session factory
     *
     */
    public static void rebuildSessionFactory() {
        try {
            //configuration.configure();
            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 = 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;
    }

}
分享到:
评论

相关推荐

    正确理解ThreadLocal.pdf

    2. **事务处理**:在事务管理中,`ThreadLocal`可以用于维护每个线程的事务状态,确保事务的完整性和一致性。 3. **日志记录**:在多线程环境中,`ThreadLocal`可以用于维护每个线程的日志上下文,如线程ID、用户名...

    hibernate源码分析一[启动过程]

    `CurrentSessionContext`接口定义了如何获取当前线程上的`Session`实例,而`ThreadLocalSessionContext`是一种实现,它使用线程本地存储(ThreadLocal)来维护每个线程上的`Session`实例,适用于web应用中的多线程...

    java之hibernate和spring技术难点及其要点总结

    2. **本地事务配置**:了解如何在Spring中配置本地事务对于优化数据访问层至关重要。 3. **分布式事务(jotm)**:当涉及到多个服务或数据库时,分布式事务成为必需,Spring支持与JOTM集成来实现这一目标。 4. **...

    java 中ThreadLocal本地线程和同步机制的比较

    例如,用ThreadLocal实现线程局部的Singleton模式,可以确保每个线程都有自己的Singleton实例,避免了线程安全问题。然而,需要注意的是,ThreadLocal变量不会自动被垃圾回收,因此在不再使用时,应手动清理...

    hibernate面试题

    - 使用ThreadLocal变量,每个线程都有自己独立的Action实例副本。 - 使用Spring框架的`prototype`作用域,每次请求都创建新的Action实例,避免线程安全问题。 2. Struts 中的关键对象及其作用: - `Action...

    spring+struts+Hibernate面试题

    - **使用线程本地变量**:通过 ThreadLocal 来保存每个线程的数据副本,从而实现线程安全。 - **利用 Struts 提供的工具类**:例如使用 `ActionForm` 的 `reset()` 方法来重置表单数据,确保每个请求都有干净的...

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

    10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...

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

    10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼 10.6.1 哪些方法不能实施Spring AOP事务 10.6.2 事务增强遗漏实例 10.7 数据连接泄漏 10.7.1 底层连接资源的访问问题 10.7.2 Spring JDBC...

    Java面试总结~~~~.docx

    - 深入理解JVM内存模型,包括堆、栈、方法区、本地方法栈等。 - 类加载机制,双亲委派模型。 - 自定义类加载器的可能性及实现。 - 类似“能不能自己写一个类叫java.lang.String”的问题,考察命名空间的理解。 ...

    Spring 2.0 开发参考手册

    12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器中使用Hibernate的注意点 12.3. JDO ...

    Spring中文帮助文档

    12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器中使用Hibernate的注意事项 12.3. ...

    spring chm文档

    12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器中使用Hibernate的注意点 12.3. JDO ...

    Spring API

    12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器中使用Hibernate的注意事项 12.3. ...

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

    12.2.5. 基于Hibernate3的原生API实现DAO 12.2.6. 编程式的事务划分 12.2.7. 声明式的事务划分 12.2.8. 事务管理策略 12.2.9. 容器资源 vs 本地资源 12.2.10. 在应用服务器中使用Hibernate的注意点 12.3. JDO 12.3.1...

    java名企面试题

    7. **SSH框架**:Struts的MVC模式,Spring的依赖注入(DI)和面向切面编程(AOP),Hibernate的对象关系映射(ORM)以及事务管理。面试中会要求实现实例或者解释相关设计模式。 8. **设计模式**:工厂模式、单例...

    java面试210道精选题

    MySQL和MyBatis、Hibernate是ORM框架,MyBatis的动态SQL和映射文件提供了灵活的SQL操作,与Hibernate相比更轻量级,但可能需要更多手动SQL操作。 【框架与技术】 Spring是企业级Java应用的主流框架,AOP(面向切面...

    Java程序员面试笔试真题与解析

    理解MVC模式,掌握Spring的依赖注入、AOP(面向切面编程)、事务管理,以及MyBatis和Hibernate的数据持久化技术,将有助于你在面试中脱颖而出。 八、数据库知识 熟悉SQL语言,包括查询、增删改查操作,以及索引、...

    Java面试宝典2018年5月最新版

    3. Hibernate:理解ORM思想,掌握Hibernate实体映射,会使用Session进行数据操作。 五、网络编程篇 1. HTTP协议:理解HTTP请求和响应的结构,掌握常见状态码的含义。 2. TCP/IP协议:了解TCP连接的建立和关闭过程,...

    Java方面技术面试题(最新的)

    4. **多线程**:Java提供了丰富的多线程支持,包括Thread类、Runnable接口、synchronized关键字、volatile关键字、ThreadLocal、ExecutorService等。面试中可能会讨论线程安全问题,死锁、活锁、饥饿等并发问题。 5...

Global site tag (gtag.js) - Google Analytics