Java 重用Hibernate SessionFactory
我有两个类实例变量:Java 重用Hibernate SessionFactory,java,hibernate,Java,Hibernate,我有两个类实例变量:userSF这是一个SessionFactory和userCfg这是一个配置设置为使用user.cfg.xml。当有人登录到我的应用程序时,他们的数据库登录信息会从文件中抓取,发生以下情况: userCfg.setProperty("hibernate.connection.username", username); userCfg.setProperty("hibernate.connection.password", password); userSF = userCfg
userSF
这是一个SessionFactory
和userCfg
这是一个配置
设置为使用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变量重新用于多次登录?您不应该为每个登录的用户/配置创建一个
SessionFactory
。它是一个非常昂贵的组件,应该针对单例模式。在应用程序中为每个上下文使用一个实例
如果有多个配置,则可以在应用程序范围中缓存多个实例。根据应用程序的不同,这可能是一个使用映射的静态Singleton
类,也可能是一个JAVA-EE容器中的@ApplicationScoped
EJB或JSFbean
如果基于用户密码
键的上下文将导致太多的会话工厂
实例,您可能应该更改应用程序,以在权限组中管理它们,或者限制您在数据访问或服务层中的功能。那么我该如何使用多个连接?我问这个问题的原因是因为每个用户在数据库中拥有不同的权限。我不知道为什么根据给定用户对数据库拥有动态权限,并且不限制数据访问层中的数据访问,但即使这是一项要求,您也可以为每个用户密码
组合保留实例。