我有两个类实例变量:userSF,它是一个SessionFactory;userCfg,它是一个为使用user.cfg.xml而设置的Configuration。当我让某人登录到我的应用程序时,他们的数据库登录信息被从文件中抓取,会发生以下情况:
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变量?
发布于 2015-12-23 10:11:57
您不应为每个登录的用户/配置创建SessionFactory。它是一个非常昂贵的组件,应该以Singleton模式为目标。在您的应用程序中为每个上下文使用单个实例。
如果您有多个配置,则可以在应用程序范围内缓存多个实例。根据应用程序的不同,这可能是使用Map<MyUserPasswordKey, SessionFactory>的静态Singleton类,也可能是JAVA-EE容器中的JSF或@ApplicationScoped -Bean。
如果基于user-password键的上下文将导致过多的SessionFactory实例,您可能应该更改您的应用程序,以便在权限组中管理它们,或者将您的功能限制在数据访问层或服务层中。
https://stackoverflow.com/questions/34427520
复制相似问题