加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 仅使用using语句的代码上的“Timeout expired”异常

发布时间:2020-12-16 02:01:45 所属栏目:百科 来源:网络整理
导读:我有一个多线程应用程序,通过 Linq到Sql与SQL服务器通信.当线程数被人为地保持在8时,应用程序在四核(Intel I-7)机器上正常运行: Parallel.ForEach(allIds,new ParallelOptions { MaxDegreeOfParallelism = 8 },x = DoTheWork(x)); 当线程数留给系统决定时:
我有一个多线程应用程序,通过 Linq到Sql与SQL服务器通信.当线程数被人为地保持在8时,应用程序在四核(Intel I-7)机器上正常运行:

Parallel.ForEach(allIds,new ParallelOptions { MaxDegreeOfParallelism = 8 },x => DoTheWork(x));

当线程数留给系统决定时:

Parallel.ForEach(allIds,x => DoTheWork(x));

运行一段时间后,我得到以下异常:

Timeout expired. The timeout period elapsed prior to obtaining a
connection from the pool. This may have occurred because all pooled
connections were in use and max pool size was reached.

我的应用程序中只有两种模式用于调用SQL:

第一:

using (var dc = new MyDataContext())
    {
        //do stuff
        dc.SafeSubmitChanges();
    }

第二:

using (var dc = new MyDataContext())
        {
            //do some other stuff
            DoStuff(dc);
        }

.....
    private void DoStuff(DataContext dc)
    {
       //do stuff
       dc.SafeSubmitChanges();
    }

我决定通过这种形式的逻辑来限制调用:

public static class DataContextExtention
{
    public const int SQL_WAIT_PERIOD = 5000;
    public static void SafeSubmitChanges(this DataContext dc)
    {
        try
        {
            dc.SubmitChanges();
        }
        catch (Exception e)
        {
            if (e.Message ==
                "Timeout expired.  The timeout period elapsed prior to obtaining a connection from the pool.  This may have occurred because all pooled connections were in use and max pool size was reached.")
            {
                System.Data.SqlClient.SqlConnection.ClearAllPools();
                System.Threading.Thread.Sleep(SQL_WAIT_PERIOD);
                dc.SafeSubmitChanges();
            }
            else
            {
                throw;
            }
        }
    }
}

这绝对没有区别.一旦应用程序抛出此类的第一个异常,应用程序中的各种随机位置(甚至与SQL服务器无关的代码行)都会开始抛出此异常.

问题1:是不是在宗教上使用声明应该防范这种情况?

Q2:出了什么问题,如何解决这个问题?

注意:大约有250,000个ID.我还在MaxDegreeOfParallelism = 16进行了测试,得到了相同的异常.

解决方法

我认为以下内容可能会有所帮助,根据我使用Oracle的经验,数据库连接池以前给我带来了问题.所以我认为SQL Server连接池可能存在类似的问题.有时知道默认连接设置并查看数据库上的连接活动是很好的信息.

如果您使用的是Sql Server 8,则默认的SQL连接池为100.默认超时为15秒.我希望让SQL管理员跟踪您在运行应用程序时所做的连接数量,并查看您在数据库服务器上的加载情况.也许还要添加一些性能计数器.由于这看起来像SQL Server异常,我会得到一些指标来看看发生了什么.您还可以使用intellitrace来帮助查看DB活动.

Intellitrace链接:http://www.dotnetcurry.com/showarticle.aspx?ID=943

Sql Server 2008连接池链接:http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.110).aspx

Performance Counters链接:http://msdn.microsoft.com/en-us/library/ms254503(v=vs.110).aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读