当前在我们的ASP.NET应用程序中,每个请求有1个会话,并且每次我们加载或更新时都创建一个事务和对象。请看下图:ASP.NET NHibernate事务持续时间
public static T FindById<T>(object id)
{
ISession session = NHibernateHelper.GetCurrentSession();
ITransaction tx = session.BeginTransaction();
try
{
obj = session.Get<T>(id);
tx.Commit();
}
catch
{
session.Close();
throw;
}
finally
{
tx.Dispose();
}
return obj;
}
public virtual void Save()
{
ISession session = NHibernateHelper.GetCurrentSession();
ITransaction transaction = session.BeginTransaction();
try
{
if (!IsPersisted)
{
session.Save(this);
}
else
{
session.SaveOrUpdateCopy(this);
}
transaction.Commit();
}
catch (HibernateException)
{
if (transaction != null)
{
transaction.Rollback();
}
if (session.IsOpen)
{
session.Close();
}
throw;
}
finally
{
transaction.Dispose();
}
}
很明显,因为它意味着你创建的数据库每次加载或保存一个对象,这会带来性能开销时间一个新的连接,这是不理想的。
问题:
- 如果一个实体在 1级高速缓存已加载将 GetTransaction()调用打开一个数据库连接 ?我怀疑它会...
- 有没有更好的方式来处理我们的交易管理,所以 有更少的交易,因此 少数据库连接?
不幸的是,应用程序代码可能是太成熟了构建一切都像这样(与获得和更新都在同一个交易):
using(var session = sessionFactory.OpenSession())
using(var tx = session.BeginTransaction())
{
var post = session.Get<Post>(1);
// do something with post
tx.Commit();
}
难道是一个可怕的想法创造每一个交易在请求结束时请求并提交它?我认为它的缺点是它绑定了一个数据库连接,而非数据库操作发生。
这是问了很多次... – Paco 2010-09-29 10:21:49
道歉,我有同样的问题上SO一看,找不到任何东西。如果有相关的问题,请让我知道,我会链接到它 – 2010-09-29 10:30:53