我遇到访问SqlServer 2005数据库的Windows服务的问题。每个星期一它都会因InvalidOperationException而崩溃:Timeout已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
我检查了所有明显的事情,比如关闭数据库连接和读者,发现没有问题。
最奇怪的是,在最后一种情况下,我设置了perf监视器来记录池中的连接数以及类似的东西,发现Sql Server实际上在服务崩溃前几天停止了,所以所有的SQL计数器显示0(该服务处理SQL Server停止并尝试每隔几秒连接一次,直到它成功重新连接)。
在SQL服务器停止之前,打开连接的数量始终为1-2,因此连接计数似乎没有问题。
我将调查SQL Server日志以寻找线索,但是如果实际连接数不是问题,也许您可以告诉我可能导致此异常的原因。
更新
检查了日志,似乎Sql Server一直没有停机。周四它被停止了,但周五重新启动。重启导致perf mon中的SQL计数器停止报告数据,因此我没有关于崩溃时连接数的真实数据。
答案 0 :(得分:1)
我认为Happenned就是这样,Ado将连接请求排队(因为可能没有使用本机提供程序停止SQL REader服务),并且当SQL Server再次启动时,它会在此时向他发送所有这些请求。这是导致无效操作异常的原因。 Sqlserver Provider做了这些事情(总而言之,他负责管理连接而不是SQL Server)
你应该做什么Dro检查代码是否正在运行Sql Service。你可以轻松地使用WMI或SQL SMO。就像3行代码一样,你已经完成了。
路
答案 1 :(得分:1)
最终Google帮助我找到了解决方案。根据此blog,当两个或多个线程同时尝试访问未响应的SQL Server实例时,可能会发生此异常。将conn.Open()
调用包装在锁中就足够了,错误就消失了。
奇怪但有效。
答案 2 :(得分:0)
周一晚上是否安排了一些维护?这可能是造成这种错误的原因。