:error connecting: 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 超时时间已到。超时时间已到,但是
:error connecting: 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
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小。
问题描述:我们获取连接超过连接池最大值时产生如上异常。通常连接池最大值为100。当我们获取连接超过最大值时,ado.net等待连接池返回连接而超时,这样将抛出如上异常
产生这样的问题: 连接数大于 n 并且超出设置的时间(所有连接池中的连接都在用,并且等待的时间超时)
解决办法:1首先要做的是在我们使用连接后立即关闭连接
2 其次我们可以通过连接字符串中的max pool size = n;来动态扩大连接池中的连接最大数量。
3 更改连接时间 connect timeout=n
首先要保证所有的 connection 连接之后 都要手动的关闭, 特别是datareader(
一个connection对象只能打开一个datareader对象,在该datareader对象关闭之前,无法打开其他的datareader对象,知道该datareader 对象调用close 方法为止)
更改 连接数量和连接时间 根据实际情况而定
为什么会出现这样的问题呢?
就是比如买票一样,五个窗口同时创建,每个人都有自己的等待时间.假如五个创建,占用一个.还有四个空闲. 占用五个.剩下的人需要等待.但是 可能等待的时间很长.这些人都会不耐烦(超出规定时间)的走了.出现异常
正规的解释- connection pool 如何工作的?(摘抄自(http://www.cnblogs.com/qqflying/archive/2012/02/13/2349583.html))
首先当一个程序执行connection.open()时候,ado.net就需要判断,此连接是否支持connection pool (pooling 默认为true),如果指定为false, ado.net就与数据库之间创建一个连接(为了避免混淆,所有数据库中的连接,都使用”连接”描述),然后返回给程序。
如果指定为 true,ado.net就会根据connectstring创建一个connection pool,然后向connection pool中填充connection(所有.net程序中的连接,都使用”connection”描述)。填充多少个connection由min pool size (默认为0)属性来决定。例如如果指定为5,则ado.net会一次与sql数据库之间打开5个连接,然后将4个connection,保存在 connection pool中,1个connection返回给程序。
当程序执行到connection.close() 的时候。如果pooling 为true,ado.net 就把当前的connection放到connection pool并且保持与数据库之间的连接。
同时还会判断connection lifetime(默认为0)属性,0代表无限大,如果connection存在的时间超过了connection lifetime,ado.net就会关闭的connection同时断开与数据库的连接,而不是重新保存到connection pool中。
(这个设置主要用于群集的sql 数据库中,达到负载平衡的目的)。如果pooling指定为false,则直接断开与数据库之间的连接。
然后当下一次connection.open() 执行的时候,ado.net就会判断新的connectionstring与之前保存在connection pool中的connection的connectionstring是否一致。
(ado.net会将connectionstring转成二进制流,所 以也就是说,新的connectionstring与保存在connection pool中的connection的connectionstring必须完全一致,即使多加了一个空格,或是修改了connection string中某些属性的次序都会让ado.net认为这是一个新的连接,而从新创建一个新的连接。所以如果您使用的userid,password的认 证方式,修改了password也会导致一个connection,如果使用的是sql的集成认证,就需要保存两个连接使用的是同一个)。
然后 ado.net需要判断当前的connection pool中是否有可以使用的connection(没有被其他程序所占用),如果没有的话,ado.net就需要判断connectionstring设 置的max pool size (默认为100),如果connection pool中的所有connection没有达到max pool size,ado.net则会再次连接数据库,创建一个连接,然后将connection返回给程序。
如果已经达到了 maxpoolsize,ado.net就不会再次创建任何新的连接,而是等待connection pool中被其他程序所占用的connection释放,这个等待时间受sqlconnection.connectiontimeout(默认是15 秒)限制,也就是说如果时间超过了15秒,sqlconnection就会抛出超时错误(所以有时候如果sqlconnection.open()方法抛 出超时错误,一个可能的原因就是没有及时将之前的connnection关闭,同时connection pool数量达到了maxpoolsize。)