天地事件中动用布满式事务,真的是SqlDataReader引起的超时

回去目录

重临目录

在拓宽大数据量读操作时,经常我们会筛选SqlData里德r,或许不会利用DataSet,原因就背着了,在本身项目中遭逢一个很想获得的难题,当sql实行时候过长时,系统被抛一个过期,链接池已满的提醒。

对于叁个集聚来讲,它大概会被增大超多事件,这里我们叫它领域职业,因为四个大团圆大家得以把它明白成三个天地,叁个事情。对于世界事件不清楚的同室能够看看笔者的那篇小说《DDD~领域事件与事件总线》,里面有详细的求证,前不久主要说一下天地里的职业,即世界事件的多少管理和主逻辑里的多少管理在相通业务里完毕。

英特网的消除情势其实大总部是对准“connection time
out“的,即链接超时,它日常建设方案是:

文化准备

SQL2005条件使用TransactionScopeNoMsdtc事务,它是占占开荒的,原理是将一堆操作包裹到二个SqlConnection里,由开拓者维护接连的关门,那也是行使时要极其注意的地点,因为只要不闭馆连接,SQL链接池会益出。

SQL2008碰着使用微软绵绵谐的布满式事务完成TransactionScope,它对于同三个上下文来讲,是不会被提高为遍布式事务的,这点对SQL2005要强超多。

1 为SQL连接串增加这一个:Connect Timeout=10000
//SQL连接超时时间

代码施行

  /// <summary>
    /// 添加WebSystem表时,所需要的事件对象
    /// </summary>
    [Serializable]
    public class WebSystemCreateEvent : EventBase
    {
        /// <summary>
        /// 数据上下文,它与架构无关,可以是Linq2Sql,EF,ADO.NET
        /// </summary>
        public IUnitOfWork UnitOfWork { get; set; }
        /// <summary>
        /// 对象主键
        /// </summary>
        public int ID { get; set; }
    }

      [HttpPost]
        public ActionResult WebSystem(FormCollection form)
        {
            //订阅领域事件
            EventBus.Instance.Subscribe<WebSystemCreateEvent>(i =>
            {
                var entity1 = new DbContextRepository<WebSystem>(i.UnitOfWork).Find(i.ID);
                entity1.WebSystemName = entity1.WebSystemName + "更新了";
                new DbContextRepository<WebSystem>(i.UnitOfWork).Update(entity1);
            });

            IUnitOfWork UnitOfWork = new backgroundEntities1();
            var db = new DbContextRepository<WebSystem>(UnitOfWork);

            using (TransactionScope trans = new TransactionScope())
            {
                var entity = new WebSystem
                {
                    Info = form["Info"],
                    Status = Convert.ToInt32(form["Status"]),
                    WebSystemName = form["WebSystemName"]
                };
                db.Insert(entity);
                //发布领域事务
                EventBus.Instance.Publish(new WebSystemCreateEvent
                {
                    ID = entity.WebSystemID,
                    UnitOfWork = UnitOfWork,
                });
                trans.Complete();
            }




            return RedirectToAction("WebSystemList");
        }

2 为SQL连接串加多这些:马克斯 Pool Size =
512 //最第比利斯接池

SQL截图

实则它们解决的是接连超时难点,而临时,你的顺序也许是在SQL解释时间相比长,设置方面多个就从未有过用了,SQL的分解施行由SqlCommand对象去调节

TransactionScopeNoMsdtc截图

图片 1

TransactionScope截图

图片 2

本土WWW网址服务器的MSDTC为禁用状态

图片 3

回去目录

由此,我们科学的做法应该是安装它的晚点时间,代码如下:

 

1   comm.CommandText = sb.ToString();
2   conn.Open();
3   comm.CommandTimeout = 0;
4   SqlDataReader reader = comm.ExecuteReader(CommandBehavior.CloseConnection);

 

前后相继再运维,难题解决,呵呵!

之所以,消亡难题应有是对正下药才行!

 

再次来到目录

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图