c# – 仅使用using语句的代码上的“Timeout expired”异常
我有一个多线程应用程序,通过
Linq到Sql与SQL服务器通信.当线程数被人为地保持在8时,应用程序在四核(Intel I-7)机器上正常运行:
Parallel.ForEach(allIds,new ParallelOptions { MaxDegreeOfParallelism = 8 },x => DoTheWork(x)); 当线程数留给系统决定时: Parallel.ForEach(allIds,x => DoTheWork(x)); 运行一段时间后,我得到以下异常:
我的应用程序中只有两种模式用于调用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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |