ASP.NET NHibernate事务持续时间
发布时间:2020-12-16 06:53:58 所属栏目:asp.Net 来源:网络整理
导读:目前在我们的ASP.NET应用程序中,每个请求有1个会话,每次加载或更新和对象时都会创建一个事务.见下文: public static T FindByIdT(object id) { ISession session = NHibernateHelper.GetCurrentSession(); ITransaction tx = session.BeginTransaction(); t
目前在我们的ASP.NET应用程序中,每个请求有1个会话,每次加载或更新和对象时都会创建一个事务.见下文:
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(); } } 显然这并不理想,因为这意味着每次加载或保存对象时都会创建与数据库的新连接,从而导致性能开销. 问题: >如果实体已经加载了 不幸的是,应用程序代码可能太成熟,无法构建所有类似的东西(在同一个事务中使用get和update all): using(var session = sessionFactory.OpenSession()) using(var tx = session.BeginTransaction()) { var post = session.Get<Post>(1); // do something with post tx.Commit(); } 为每个请求创建一个事务并在请求结束时提交它是一个可怕的想法吗?我猜不到的缺点是它会在非数据库操作发生时绑定一个数据库连接. 解决方法
每个请求的一个事务被认为是NHibernate的最佳实践.此模式在
Sharp Architecture中实现.
但是在Nhibernate方法中,BeginTransaction()doest打开与DB的连接.连接在第一个真正的sql请求时打开,并在执行查询后立即关闭.所以Nhibernate持有开放连接几秒钟来执行查询.您可以通过SQL事件探查器进行验证. 此外,NHiberante总是尝试使用Sql Servers连接池,为什么打开你的连接可能不是那么昂贵. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- asp.net-core – AspNetCore中的控制器配置
- 在对ASP.NET MVC Action的AJAX请求期间有网络请求超时时会发
- 如何在ASP.NET全球化中配置不变文化?
- asp.net – IIS 7的最大默认POST请求大小 – 如何增加64kB
- asp.net – 如何在IIS Express下启用区分大小写?
- asp.net – 在按钮单击时动态添加新文本框
- asp.net-mvc-2 – ASP MVC2中部分缓存的当前做法是什么?
- asp.net-mvc-4 – 使用从控制器操作返回的JSON.NET日期格式
- 【译】使用Jwt身份认证保护 Asp.Net Core Web Api
- 如何判断ASP中的页面是否为SSL?
推荐文章
站长推荐
热点阅读