我有几个类实例变量:userSF
是SessionFactory
和userCfg
,Configuration
设置使用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变量重用于多次登录?
答案 0 :(得分:3)
您不应为每个登录的用户/配置创建SessionFactory
。它是一个非常昂贵的组件,应该以{{1}}模式为目标。在应用程序中为每个上下文使用单个实例。
如果您有多个配置,则可以在应用程序范围内缓存多个实例。根据您的应用程序,这可能是使用Singleton
的静态Singleton
类,或者是JAVA-EE容器中的Map<MyUserPasswordKey, SessionFactory>
EJB或JSF-Bean。
如果基于@ApplicationScoped
密钥的上下文会导致过多的user-password
个实例,您可能应该更改应用程序,以便在权限组中管理它们或限制数据访问或服务中的功能层