Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重用Hibernate SessionFactory_Java_Hibernate - Fatal编程技术网

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


如果基于
用户密码
键的上下文将导致太多的
会话工厂
实例,您可能应该更改应用程序,以在权限组中管理它们,或者限制您在数据访问或服务层中的功能。

那么我该如何使用多个连接?我问这个问题的原因是因为每个用户在数据库中拥有不同的权限。我不知道为什么根据给定用户对数据库拥有动态权限,并且不限制数据访问层中的数据访问,但即使这是一项要求,您也可以为每个
用户密码
组合保留实例。