-
dOperationException:
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.
Timeout
expired
异常是个很棘手的异常,想必几乎每个人都碰到过。有时可真是对它咬牙
切齿,拿它没办法。
angelsb
这篇文章很好,希望对大
家有用。我也是看到他讲得很好,才
翻译过来的,水平有限,请多多指教
.
dOperationException:
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.
哎
!
在另一个进程
中
,
又出现了连接池已满的问题
,
p>
这是个最让人头痛却又是最常出现的连接
池问题之一
.
原因是在开发过程中很少碰到这个头痛的问题
,
p>
但在部署
APP
到客户端时
,
却总
是不经意地跑出来了
.
我想
,
我应该花些许时间对这个问题进
行一次完整的总结吧
.
发生的本质是什么
?
我们来认真看一下可能会发生这种异常的两种情况
1)
你使用了超过最大的连接池连接数
(
默认的最大连接数是
100)
在
大部分应用程序中
,
这种情况是很少出现的
.
毕竟当你使用连接池时
,100
个并行连接是一
个非常大的数字
.
根
据我的经验
,
会造成这种异常的原因的最大可能
,
应该是在一个纯种下打
开了
100
个连接
.
程序代码
SqlConnection[] connectionArray = new
SqlConnection[101];
for (inti = 0; i<=
100; i++)
{
connectionArray[i]
=
new
SqlConnection(
;Integrated
security=sspi;connection
timeout=5
connectionArray[i].Open();
}
解决
方案
:
如果你确定你将会使用超过
10
0
个并行连接
(
在同一连接字符串上<
/p>
),
你可以增加最
大连接数
.
2)
连接泄漏
p>
我个人认为的连接泄漏定义是你打开了一个连接但你没有在你的代码中执行
< br>close()
或
dispose().
这范围不仅仅是你忘记了在
connection
后连
接后使用
dispose()
或
clo
se()
对期进行关
闭
,
还包括一些你已经在相关
connection
后写
好了
close()
却根本没有起作用的情況
< br>.
我们来看
看下面的代码
:
程序代码
using System;
;
ent;
public class Repro
{