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.

Reply via email to