将不明确成为明显威尼斯人6799.com

回到目录

归来目录

在进行大数据量读操作时,一般大家会选用SqlDataReader,或然不会利用DataSet,原因就隐瞒了,在自个儿项目中遇到一个很奇怪的标题,当sql实行时候过长时,系统被抛八个超时,链接池已满的唤醒。

对于transactionscope不打听的同桌,能够看本身的连锁小说

网络的消除措施其实大总局是针对性“connection time
out“的,即链接超时,它一般消除方案是:

 

第三拾伍遍  
将不明确成为鲜明~transactionscope何时进步为布满式事务?

第二十五遍  
将不鲜明成为鲜明~transactionscope曾几何时提高为分布式事务~续

第二14遍  
将不鲜明成为鲜明~transactionscope何时升高为分布式事务~再续(幸免引起不必要的MSDTC)

第贰拾八遍  
将不显著成为显著~transactionscope哪一天提高为布满式事务~大结局

第四十二回  
将不显著成为鲜明~transactionscope曾几何时升高为布满式事务~SQL2005与SQL2008不同

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

声明:

对此这种业务,假如指望程序出错自动回滚,必须将那多少个throw出来,无法愉愉的用日志记录!

2 为SQL连接串加多那些:马克斯 Pool Size =
512 //最特古西加尔巴接池

测试:

对于sql二〇〇九曾经很好的支撑了transactionscope,而对此sql二〇〇五以来,支持的不是很好,它将八个savechanges()方法提高为分布式事务msdtc,它不管你是或不是为贰个数据库,真是没有办法了!幸而,最棒找到了缓和办法,下边图所示,将三个insert,update包裹到三个transactionscope里,所发生的结果如下:

威尼斯人6799.com 1

粗略来讲,正是sp_reset_connection重新接纳贰回SQL链接时,你的业务里的代码是被装进在一块发送过来的,那时,假诺有一条SQL语句出现相当,整个包会产生callback!

威尼斯人6799.com 2

地方图中,只要有一条语句出现SQL分外,都会时有发生回滚,从而保险了数量的完整性。

自然,大家的微管理器中,并从未开启msdtc服务,有图有真像

威尼斯人6799.com 3

前提:Db数据上下文对象必须与action指向的办法体里的上下文是同一个。

有关原始代码为:

    var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)Db).ObjectContext;
            try
            {
                objectContext.Connection.Open();
                using (TransactionScope trans = new TransactionScope())
                {
                insert1();
                insert2();
                }
            }
            catch (Exception)
            {

                throw;
            }
            finally
            {
                objectContext.Connection.Close();
            }

OK,大家将地点代码进行三个包裹,让它访谈起来更有益于一些,看代码:

 /// <summary>
    /// Author:zhang.zhanling
    /// 对TransactionScope,让它对同一个数据库不产生msdtc服务
    /// </summary>
    public class TransactionScopeNoMsdtc
    {
        /// <summary>
        /// 产生包裹事务
        /// </summary>
        /// <param name="db">数据上下文</param>
        /// <param name="isOutermost">是否为最外层,默认为false</param>
        /// <param name="action">处理代码块</param>
        public static void UsingNoMsdtc(DbContext db, bool isOutermost, Action action)
        {
            var objectContext = ((System.Data.Entity.Infrastructure.IObjectContextAdapter)db).ObjectContext;
            try
            {
                if (objectContext.Connection.State == System.Data.ConnectionState.Closed)
                    objectContext.Connection.Open();
                using (TransactionScope trans = new TransactionScope())
                {
                    action();
                    trans.Complete();
                }
            }
            finally
            {
                if (isOutermost)//如果是最外层事务,而将连接关闭
                    objectContext.Connection.Close();
            }
        }
        /// <summary>
        /// 产生包裹事务,它不是最外层的,如果是最外层的需要调用其它重载
        /// </summary>
        /// <param name="db"></param>
        /// <param name="action"></param>
        public static void UsingNoMsdtc(DbContext db, Action action)
        {
            UsingNoMsdtc(db, false, action);
        }
    }

 

在选取时,大家能够这么来做,不用TransactionScope,而是用TransactionScopeNoMsdtc呵呵。

   EntityFrameworks.Data.Core.TransactionScopeNoMsdtc.UsingNoMsdtc(Db, () =>
            {
            insert1();
            insert2();
            });

感激阅读!

归来目录

事实上它们化解的是接连超时难点,而一时,你的次第只怕是在SQL解释时间相比长,设置方面八个就从不用了,SQL的表明施行由SqlCommand对象去调整

故而,大家精确的做法应该是设置它的超时时间,代码如下:

 

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

 

程序再运营,难题一举成功,呵呵!

就此,解决难题应当是对正下药才行!

 

重临目录