文档章节

Hibernate 在多线程下 获取唯一的SessionFactory

古世界
 古世界
发布于 2014/06/07 11:02
字数 659
阅读 376
收藏 0

Hibernate 在多线程下 获取唯一的SessionFactory

    背景:  在项目中使用了Hibernate, 连接池用的是c3p0, 最小连接数设置为5, 问题来了, 每当登录系统后, 在数据库中查看连接数就会发现有10个session连接, 这让我很是苦恼, 经过debug发现在开始登录的时候, 页面会同时发出两个ajax请求, 请求后台数据的数据, 这个时候在后台就会有两个线程同时去请求HibernateUtil创建SessionFactory(当然这个时候就是SessionFactory的初始化), 在没有线程同步的情况下, 两个线程就会使HibernateUtil初始化出两个SessionFactory, 这样每个SessionFactory都会保持5个最小连接数, 那么在数据库端就会看到有10个session连接了, 忘了介绍web容器使用的是tomcat.

    解决方案: 发现问题了, 当然解决方案也就有了, 两种法案: 1.既然是多线程的问题, 那就设置线程同步好了,但是感觉这样有点不太优雅; 2. 如果我在ajax请求还没访问后台之前, 就将SessionFactory初始化好了, 也就不会多线程同时请求初始化SessionFactory的问题了;

   贴一下代码看看吧: (为了确保安全, 我两种方案都使用了)

public class HibernateUtil {

    private static SessionFactory sessionFactory = null;
    
    private static Configuration config =
            new Configuration().configure("hibernate.cfg.xml");

    static {  //此处就是第二中解决方案, 当类加载的时候就初始化好SessionFactory
        configureSessionFactory();
    }

    /**
     * 创建SessionFactory, 此方法加了锁, 就是为了线程同步
     */
    private synchronized static void configureSessionFactory () throws HibernateException {
        if(sessionFactory != null && !sessionFactory.isClosed()){
            return;
        }
        // 以下这两句就是4.3的新用法
        StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
                .applySettings(config.getProperties());
        ServiceRegistry registry = builder.build();
        sessionFactory = config.buildSessionFactory(registry);
    }

    /**
     * 获取sessionFactory
     * @return sessionFactory
     */
    public static SessionFactory getSessionFactory() {
        if(sessionFactory == null || sessionFactory.isClosed()){
            configureSessionFactory();
        }
        return sessionFactory;
    }
}

以上就是此次问题的解决方案, 但是我有一事想不通, SessionFactory变量本身属于HibernateUtil的静态变量, 可是为什么当多线程同时请求初始化SessionFactory时, 会初始化出两个SessionFactory呢, 难道HibernateUtil本身在内存中就有两份? 本人菜鸟一个, 还请高手大神们指教一二, 不胜感激 ... ...

© 著作权归作者所有

共有 人打赏支持
古世界
粉丝 13
博文 28
码字总数 7386
作品 0
济南
后端工程师
配置hibernate手动配置

手动配置: 1.CROD 操作 界面 testmain.java Domain service 数据持久层 数据库 Mysql Oreacle Sqlserver 2.引用hibernate jar包 3.POJO介绍 使用hibernate 时 要求数据库的某张表相互对应的...

空_明
2012/07/09
0
0
博为峰Java技术文章 ——JavaEE Hibernate初始化类

博为峰小博老师: Session对象是Hibernate中数据库持久化操作的核心,它负责Hibernate所有的持久化操作,通过它开发人员可以实现数据库基本的增、删、查、改的操作。而Session对象又是通过Ses...

博为峰教研组
2016/12/28
0
0
openSession和getCurrentSession区别

openSession:当调用SessionFactory的openSession方法时,它总是创建一个完全全新的session给你.你需要显示的刷新并且关闭session对象.因为session对象不是线程安全的,在多线程环境中你需要为每...

AK灬
06/29
0
0
创建LocalSessionFactory对象

Spring里面的SessionFactory一般如下配备在xml中: <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation" va......

关河
2016/04/10
226
0
Quartz2.2.1开发问题

一、org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean报 java.io.NotSerializableException异常,需要自己实现QuartzJobBean。 二、dao必须要实现序列化接口,Hib......

tmac1yan
2016/01/20
105
0

没有更多内容

加载失败,请刷新页面

加载更多

一个可能的NEO链上安全随机数解决方案

0x00 困境 链上安全随机数生成应该算是一个比较蛋疼的问题,哪怕你的系统再牛逼,合约程序困在小小的虚拟机里,哪怕天大的本事也施展不开。 更悲催的是,交易执行的时候,是在每一个节点都执...

暖冰
17分钟前
0
0
【大福利】极客时间专栏返现二维码大汇总

我已经购买了如下专栏,大家通过我的二维码你可以获得一定额度的返现! 然后,再给大家来个福利,只要你通过我的二维码购买,并且关注了【飞鱼说编程】公众号,可以加我微信或者私聊我,我再...

飞鱼说编程
今天
1
0
Spring5对比Spring3.2源码之容器的基本实现

最近看了《Spring源码深度解析》,该书是基于Spring3.2版本的,其中关于第二章容器的基本实现部分,目前spring5的实现方式已有较大改变。 Spring3.2的实现: public void testSimpleLoad(){...

Ilike_Java
今天
1
0
【王阳明心学语录】-001

1.“破山中贼易,破心中贼难。” 2.“夫万事万物之理不外于吾心。” 3.“心即理也。”“心外无理,心外无物,心外无事。” 4.“人心之得其正者即道心;道心之失其正者即人心。” 5.“无...

卯金刀GG
今天
2
0
OSChina 周三乱弹 —— 我们无法成为野兽

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ _刚刚好: 霸王洗发水这波很骚 手机党少年们想听歌,请使劲儿戳(这里) hahahahahahh @嘻酱:居然忘了喝水。 让你喝可乐的话, 你准忘不了...

小小编辑
今天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部