In your design , you need to take the following into account: * The session instance is not thread-safe. It is not intended that a single instance should be readily usable from multiple threads.
* The session represents a logical unit of work. It is not intended that a single instance be kept around for a long time. In many cases, the session lives only for the length of a single transaction, though other patterns are possible. Keep in mind that the session keeps a cache of all loaded objects and will grow in memory and time consumption (due to excessive dirty checking) unless recreated fairly frequently, or Evict() or similar methods are called to empty the cache. In a web app, a common pattern (open-session-in-view) is to use one session instance for each http request. In desktop apps, one possible pattern is open-session-for-each-dialog. Depending on your architecture, even your desktop app may be focused around a "service layer" through which all calls to business operations are routed, in which case one can explore using a session for each such call. /Oskar 2011/5/23 litgle <[email protected]>: > Thanks for Ciao, Oskar > > My DAO code as follow: > > SessionManager.cs > ========================================================================================================= > public sealed class SessionManager : IDisposable > { > private ISessionFactory sessionFactory; > private Configuration cfg; > private ISession session; > private ITransaction trans; > > public static SessionManager Instance > { > get > { > return Nested.nHibernateSessionManager; > } > } > > private class Nested > { > static Nested() { } > internal static readonly SessionManager > nHibernateSessionManager = new SessionManager(); > } > > private Configuration ReadConfig(string connstring) > { > ReadProperty(connstring); > ReadMap(); > return cfg; > } > > private Configuration ReadProperty(string connstring) > { > if (string.IsNullOrWhiteSpace(connstring)) > throw new ApplicationException("Connection string > cann't empty!"); > > > cfg.SetProperty(NHibernate.Cfg.Environment.CollectionTypeFactoryClass, > typeof(uNhAddIns.WPF.Collections.WpfCollectionTypeFactory).AssemblyQualifiedName); > > cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionProvider, > typeof(NHibernate.Connection.DriverConnectionProvider).AssemblyQualifiedName); > > cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionString, > connstring); > cfg.SetProperty(NHibernate.Cfg.Environment.Dialect, > typeof(NHibernate.Dialect.MsSql2008Dialect).AssemblyQualifiedName); > > cfg.SetProperty(NHibernate.Cfg.Environment.ConnectionDriver, > typeof(NHibernate.Driver.SqlClientDriver).AssemblyQualifiedName); > cfg.SetProperty(NHibernate.Cfg.Environment.ShowSql, > "true"); > cfg.SetProperty(NHibernate.Cfg.Environment.DefaultSchema, > "dbo"); > > cfg.SetProperty(NHibernate.Cfg.Environment.ProxyFactoryFactoryClass, > typeof(NHibernate.ByteCode.Castle.ProxyFactoryFactory).AssemblyQualifiedName); > > return cfg; > } > > private Configuration ReadMap() > { > cfg.AddAssembly("DomainAssembly"); > > return cfg; > } > > public ISession GetSession(string connstring) > { > if (cfg == null) > { > cfg = new Configuration(); > cfg = ReadConfig(connstring); > } > > if (sessionFactory == null) > sessionFactory = cfg.BuildSessionFactory(); > > return OpenSession(); > } > > private ISession OpenSession() > { > if (session == null || !session.IsOpen || ! > session.IsConnected) > session = sessionFactory.OpenSession(); > > return session; > } > > public void Dispose() > { > if (session != null) > session.Dispose(); > } > > public void CloseSession() > { > try > { > if (session != null) > { > session.Flush(); > session.Close(); > } > } > finally > { > session.Dispose(); > } > } > > public void BeginTransaction(string connstring) > { > if (trans == null) > { > trans = GetSession(connstring).BeginTransaction(); > } > } > > public void CommitTransaction() > { > try > { > if (trans != null && !trans.WasCommitted && ! > trans.WasRolledBack) > { > trans.Commit(); > } > } > catch (Exception ex) > { > RollbackTransaction(); > throw ex; > } > } > > public void RollbackTransaction() > { > try > { > if (trans != null && !trans.WasCommitted && ! > trans.WasRolledBack) > { > trans.Rollback(); > } > } > finally > { > CloseSession(); > } > } > } > ========================================================================================================= > > ManagerBase.cs > ========================================================================================================= > public class ManagerBase<T> where T : DomainBase > { > public ReturnValueBoolean Refresh(T obj) > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > > session.Refresh(obj); > session.Flush(); > SessionManager.Instance.CommitTransaction(); > obj.ClearChanged(); > > return new ReturnValueBoolean(0, true, "Success"); > } > > public ReturnValueBoolean Save(T obj) > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > > session.Save(obj); > session.Flush(); > SessionManager.Instance.CommitTransaction(); > obj.ClearChanged(); > > return new ReturnValueBoolean(0, true, "Success"); > } > > public ReturnValueBoolean Update(T obj) > { > > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > > session.Update(obj); > session.Flush(); > SessionManager.Instance.CommitTransaction(); > obj.ClearChanged(); > > return new ReturnValueBoolean(0, true, "Success"); > } > > public ReturnValueBoolean SaveOrUpdate(T obj) > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > > session.SaveOrUpdate(obj); > session.Flush(); > SessionManager.Instance.CommitTransaction(); > obj.ClearChanged(); > > return new ReturnValueBoolean(0, true, "Success"); > } > > public ReturnValueBoolean SaveOrUpdate(IList<T> lobj) > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > > foreach (T obj in lobj) > { > session.SaveOrUpdate(obj); > obj.ClearChanged(); > } > session.Flush(); > SessionManager.Instance.CommitTransaction(); > > return new ReturnValueBoolean(0, true, "Success"); > } > > public ReturnValueBoolean Delete(T obj) > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > > session.Delete(obj); > session.Flush(); > SessionManager.Instance.CommitTransaction(); > > return new ReturnValueBoolean(0, true, "Success"); > } > > public ReturnValue<T> Get(int id) > { > if (id <= 0) > return new ReturnValue<T>(1, default(T), > "failed"); > else > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > > T rt = session.Get<T>(id); > SessionManager.Instance.CommitTransaction(); > if (rt == null) > return new ReturnValue<T>(1, null, "failed"); > else > return new ReturnValue<T>(0, rt, "Success"); > } > } > > public ReturnValue<IList<T>> Select(string orderfield) > { > > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > ICriteria criteria; > if (string.IsNullOrWhiteSpace(orderfield)) > criteria = session.CreateCriteria(typeof(T)); > else > criteria = > session.CreateCriteria(typeof(T)).AddOrder(Order.Asc(orderfield)); > > IList<T> rt = criteria.List<T>(); > SessionManager.Instance.CommitTransaction(); > return new ReturnValue<IList<T>>(0, rt, "Success"); > } > > public ReturnValue<IList<T>> GetList() > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ReturnValue<IList<T>> ilu = Select(string.Empty); > ReturnValue<IList<T>> rt; > if (ilu.Flag == 0) > { > rt = new ReturnValue<IList<T>>(0, ilu.Value, > "Success"); > } > else > { > rt = new ReturnValue<IList<T>>(-1, null, > ilu.Message); > } > > SessionManager.Instance.CommitTransaction(); > return rt; > } > > public ReturnValue<IList<T>> Query(QueryCriteria<T> > queryCriteria) > { > > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > IList<T> rt = queryCriteria.Criteria.List<T>(); > > SessionManager.Instance.CommitTransaction(); > return new ReturnValue<IList<T>>(0, rt, "Success"); > } > > public ReturnValue<IList<T>> Query(QueryCriterion > queryCriterion, string subPropertyName, QueryCriterion subCriterion) > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > IList<T> rt = > session.CreateCriteria(typeof(T)).Add(queryCriterion.Criterion).CreateCriteria(subPropertyName).Add(subCriterion.Criterion).List<T>(); > SessionManager.Instance.CommitTransaction(); > return new ReturnValue<IList<T>>(0, rt, "Success"); > } > > public ReturnValue<IList<T>> Query(T obj) > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > IList<T> rt = > session.CreateCriteria(typeof(T)).Add(Example.Create(obj)).List<T>(); > SessionManager.Instance.CommitTransaction(); > return new ReturnValue<IList<T>>(0, rt, "Success"); > } > > public ReturnValue<IList> Query(QueryCriterion queryCriterion, > QueryProjection queryProjection) > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > IList rt = > session.CreateCriteria(typeof(T)).Add(queryCriterion.Criterion).SetProjection(queryProjection.ProjectionList).List(); > SessionManager.Instance.CommitTransaction(); > return new ReturnValue<IList>(0, rt, "Success"); > } > > public ReturnValue<DateTime?> GetDateFromServer() > { > > SessionManager.Instance.BeginTransaction(RunTime.ConnString); > ISession session = > SessionManager.Instance.GetSession(RunTime.ConnString); > IQuery q = session.GetNamedQuery("CurrentDate"); > var date = q.UniqueResult<DateTime>(); > SessionManager.Instance.CommitTransaction(); > RunTime.ServerDateTime = date; > return new ReturnValue<DateTime?>(0, date, "Success"); > } > } > ========================================================================================================= > > How do i change code to fixed this problem? > > Regards, > litgle > > On 5月23日, 下午3时48分, Giulio Petrucci <[email protected]> wrote: >> Hi there, >> >> 2011/5/22 Oskar Berggren <[email protected]>: >> >> > Don't do that. >> >> +1. >> >> Ciao, >> Giulio >> >> -- > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]. > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
