重用Hibernate SessionFactory

时间:2015-12-23 02:08:47

标签: java hibernate

我有几个类实例变量:userSFSessionFactoryuserCfgConfiguration设置使用user.cfg.xml 。当我有人登录我的应用程序时,他们会从文件中获取数据库登录信息,以下情况发生:

userCfg.setProperty("hibernate.connection.username", username);
userCfg.setProperty("hibernate.connection.password", password);
userSF = userCfg.buildSessionFactory();

当用户退出应用程序时,它会关闭会话工厂。然后,当另一个用户尝试登录时,调用相同的代码,用户名和密码根据登录的人员进行更改。问题是第二次调用它时我得到了异常:

org.hibernate.HibernateException: HHH000469: The ClassLoaderService can not be reused. This instance was stopped already.

有没有办法将SessionFactory变量重用于多次登录?

1 个答案:

答案 0 :(得分:3)

您不应为每个登录的用户/配置创建SessionFactory。它是一个非常昂贵的组件,应该以{{1​​}}模式为目标。在应用程序中为每个上下文使用单个实例。

如果您有多个配置,则可以在应用程序范围内缓存多个实例。根据您的应用程序,这可能是使用Singleton的静态Singleton类,或者是JAVA-EE容器中的Map<MyUserPasswordKey, SessionFactory> EJB或JSF-Bean。

如果基于@ApplicationScoped密钥的上下文会导致过多的user-password个实例,您可能应该更改应用程序,以便在权限组中管理它们或限制数据访问或服务中的功能层