我是Nhibernate的新手,並通過學習來減慢我的工作方式。我試圖實現一個會話管理器類來幫助我獲得我的數據庫調用的會話。以下是它的代碼。有人可以說,這是否在架構上是正確的,並預見到可擴展性或性能的任何問題?nhibernate會話管理器實現
public static class StaticSessionManager
{
private static ISession _session;
public static ISession GetCurrentSession()
{
if (_session == null)
OpenSession();
return _session;
}
private static void OpenSession()
{
_session = (new Configuration()).Configure().BuildSessionFactory().OpenSession();
}
public static void CloseSession()
{
if (_session != null)
{
_session.Close();
_session = null;
}
}
}
,並在我的數據提供者類,我用下面的代碼來獲取數據。
public class GenericDataProvider<T>
{
NHibernate.ISession _session;
public GenericDataProvider()
{
this._session = StaticSessionManager.GetCurrentSession();
}
public T GetById(object id)
{
using (ITransaction tx = _session.BeginTransaction())
{
try
{
T obj = _session.Get<T>(id);
tx.Commit();
return obj;
}
catch (Exception ex)
{
tx.Rollback();
StaticSessionManager.CloseSession();
throw ex;
}
}
}
}
然後
public class UserDataProvider : GenericDataProvider<User>
{
public User GetUserById(Guid uid)
{
return GetById(uid)
}
}
頁
UserDataProvider udp = new UserDataProvider();
User u = udp.GetUserById(xxxxxx-xxx-xxx);
最終用途是這東西是正確的嗎?實例化單個頁面中的很多數據提供者會導致問題嗎?
,我也面臨着一個問題,現在,在那裏,如果我同時做多臺機器同一個讀操作,NHibernate的拋出隨機錯誤 - 我認爲這是由於交易。
請指教。
不要使用'throw ex;'那樣的。爲了正確地重新拋出一個異常,使用'throw;'。執行'throw ex;'會導致異常的原始堆棧跟蹤被丟棄,然後(不太重要)會產生額外的性能影響,從該行代碼開始生成新的堆棧跟蹤。令人沮喪的是,你將無法知道原始異常是從哪裏拋出的,因爲你丟失了原始堆棧跟蹤。 – 2012-02-09 19:28:45