2015-12-23 83 views
1

我有幾個類實例變量:userSF這是一個SessionFactoryuserCfg這是一個Configuration設置爲使用user.cfg.xml。當我有一個人登錄到我的應用程序他們的數據庫登錄信息被從文件中出現以下情況抓起:重用休眠SessionFactory

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變量進行多次登錄的方法?

回答

3

您不應爲每個登錄用戶/配置創建SessionFactory。這是一個非常昂貴的組件,應該以Singleton模式爲目標。在應用程序中爲每個上下文使用單個實例。

如果您有多個配置,則可以在應用程序範圍內緩存多個實例。根據您的應用程序,這可能是一個使用Map<MyUserPasswordKey, SessionFactory>的靜態Singleton類,或者在JAVA-EE容器中的EJB或JSF-Bean。

如果基於user-password密鑰的上下文將導致太多SessionFactory實例,那麼您可能應該將應用程序更改爲在權限組中管理它們或限制數據訪問或服務層中的功能。

+0

那麼我該如何去使用多個連接呢?我問的原因是因爲每個用戶在數據庫中擁有不同的權限。 –

+0

我不知道爲什麼根據給定用戶對數據庫有動態權限,並且不要限制數據訪問層中的數據訪問,但即使這是一個要求,您也可以爲每個「用戶密碼」組合保存實例。 – djmj