文档章节

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

古世界
 古世界
发布于 2014/06/07 11:02
字数 659
阅读 369
收藏 0
点赞 7
评论 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本身在内存中就有两份? 本人菜鸟一个, 还请高手大神们指教一二, 不胜感激 ... ...

© 著作权归作者所有

共有 人打赏支持
古世界
粉丝 12
博文 22
码字总数 6961
作品 0
济南
后端工程师
对Hibernate中Session与Thread绑定的一点认识

对Hibernate中Session与Thread绑定的一点认识

java-苦苦甜甜 ⋅ 2012/10/18 ⋅ 0

配置hibernate手动配置

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

空_明 ⋅ 2012/07/09 ⋅ 0

博为峰Java技术文章 ——JavaEE Hibernate初始化类

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

博为峰教研组 ⋅ 2016/12/28 ⋅ 0

创建LocalSessionFactory对象

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

关河 ⋅ 2016/04/10 ⋅ 0

Quartz2.2.1开发问题

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

tmac1yan ⋅ 2016/01/20 ⋅ 0

Hibernate报错org.hibernate.MappingException: Unknown entity: 。。。。

这是因为Hibernate 4.x和5.x中的ServiceRegistry写法不同造成的 Hibernate 4.x //1.创建一个SessionFactory对象 SessionFactory sessionFactory=null; //2.创建一个configuration对象,必须要......

JAVA好学 ⋅ 2017/05/19 ⋅ 0

ThreadLocal浅析

一、概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局...

我类个擦 ⋅ 2013/10/09 ⋅ 1

初始Hibernate4.3-01

关于Hinernate三个非常重要的类,配置类(Configuration)、会话工厂类(SessionFactory)、会话类(Session)。 配置类:Configuration 配置类主要负责管理Hibernate的配置信息以及启动信息。如:...

Mr_K ⋅ 2016/06/22 ⋅ 0

hibernate.current_session_context_class属性配置

此设置的作用如下: What does sessionFactory.getCurrentSession() do? First, you can call it as many times and anywhere you like, once you get hold of your SessionFactory (easy th......

java-苦苦甜甜 ⋅ 2012/10/18 ⋅ 0

Hibernate杂问

1 谈谈你对ORM框架的基本思想的了解? 首先 ORM是 对象关系映射,是为了解决类似于JDBC实现对象持久化的问题开发的。 框架的基本特征:完成面向对象的编程语言到关系数据库之间的映射。 他的...

陈嘻嘻哈哈 ⋅ 2015/12/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

645. Set Mismatch - LeetCode

Question 645. Set Mismatch Solution 思路: 遍历每个数字,然后将其应该出现的位置上的数字变为其相反数,这样如果我们再变为其相反数之前已经成负数了,说明该数字是重复数,将其将入结果r...

yysue ⋅ 28分钟前 ⋅ 0

Confluence 6 从生产环境中恢复一个测试实例

请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明。 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 Confluence 服务器,同时还会设置一个...

honeymose ⋅ 33分钟前 ⋅ 0

Python这么强?红包杀手、消息撤回也可以无视,手机App辅助!

论述 标题也许有点不好理解,其实就是一款利用Python实现的可以监控微信APP内的红包与消息撤回的助手。不得不说,这确实是一款大家钟意的神器。 消息撤回是一件很让人恶心的事,毕竟人都是有...

Python燕大侠 ⋅ 44分钟前 ⋅ 0

压缩打包介绍、gzip压缩工具、bzip2压缩工具、xz压缩工具

压缩打包介绍 压缩的好处不仅能节省磁盘空间而且在传输的时候节省传输时间和网络带宽 windows系统下文件带有 .rar .zip .7z 后缀的就是压缩文件 linux系统下则是 .zip, .gz, .bz2, .xz, ...

黄昏残影 ⋅ 49分钟前 ⋅ 0

观察者模式

1.利用java原生类进行操作 package observer;import java.util.Observable;import java.util.Observer;/** * @author shadow * @Date 2016年8月12日下午7:29:31 * @Fun 观察目标 **/......

Cobbage ⋅ 51分钟前 ⋅ 0

Ubuntu打印服务器配置

参考:https://blog.csdn.net/gsls200808/article/details/50950586 https://blog.csdn.net/jiay2/article/details/80252369 https://wiki.gentoo.org/wiki/HPLIP 由于媳妇儿要大量打印资料,......

大熊猫 ⋅ 57分钟前 ⋅ 0

面试的角度诠释Java工程师(二)

原文出处: locality 续言: 相信每一位简书的作者,都会有我这样的思考:怎么写好一篇文章?或者怎么写好一篇技术类的文章?我就先说说我的感悟吧,写文章其实和写程序是一样的。为什么我会...

颖伙虫 ⋅ 今天 ⋅ 0

github中SSH的Key

https://help.github.com/articles/connecting-to-github-with-ssh/ https://help.github.com/articles/testing-your-ssh-connection/ https://help.github.com/articles/adding-a-new-ssh-k......

whoisliang ⋅ 今天 ⋅ 0

only_full_group_by

我的mysql是在CentOS7.1下面的5.7.17 在 /etc/my.cnf 文件里加上如下: sql_mode='NO_ENGINE_SUBSTITUTION' 然后,重启Mysql服务 systemctl restart mysqld...

SunHacker ⋅ 今天 ⋅ 0

实际项目(SpringBoot项目)中集成Druid

参考网页 https://blog.csdn.net/liuchuanhong1/article/details/55050131 https://blog.csdn.net/CoffeeAndIce/article/details/78707819 https://www.pocketdigi.com/20170530/1577.html 为......

karma123 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部