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
中文错误信息:
超时时间已到。超时时间已到,但是尚未从池中获取连接。出现这种情况可能是因为所有池连接均在使用,并且达到了最大池大小
连接池(connection pool)
对于共享资源,有一个很著名的%ignore_a_1%模式:资源池(resource pool)。该模式正是为解决资源频繁分配、释放所造成的问题。数据库连接池(connection pool)的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从缓冲池中取出一个连接,使用完毕后再放回去。数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。避免重复多次的打开数据库连接而造成的性能的下降问题和系统资源的浪费问题。
连接池相关参数
由于访问数据库的驱动很多,不同驱动的连接池参数等可能有所差异,具体以实际情况为准,我们以ado.net为例,来分析一个连接数据库的连接配置,providername=”system.data.sqlclient”, 这里没有设置max pool size、pooing等参数,那么其实都是取其对应的默认值。其中pooling参数默认情况下为true,max pool size值为100
键值 | 默认值 | 描述 |
---|---|---|
max pool size | 100 | 池中允许的最大连接数。有效值大于或等于1。 小于最小池大小的值会生成错误。 |
min pool size | 0 | 池中允许的最小连接数。 有效值大于或等于0。 此字段中的零(0)表示最初没有打开最小值连接。 大于最大池大小的值会生成错误。 |
pooling | true | 如果此项的值设置为 true,则在应用程序关闭时,将向池中添加任何新创建的连接。 在下一次尝试打开相同的连接时,该连接将从池中提取。 如果连接具有相同的连接字符串,则将其视为相同。 不同连接具有不同的连接字符串。 此键的值可以为 “true”、“false”、“yes” 或 “no”。 |
poolblockingperiod | auto | 设置连接池的阻塞期行为。 有关详细信息,请参阅 poolblockingperiod 属性。 |
错误的原因其实就是连接池中的连接被用完了,后面的请求建立数据库连接时,连接池中没有可用的资源(连接),那么就分配到等待连接池分配的队列中,而其等待的时间超过了参数“connection timeout”的值,就抛出这个异常信息。
错误的解决方案:
1:业务量突然暴增,当前并发请求连接数据的数量超过了连接池的最大连接数(默认情况下,最大连接数是100),出现这种情况时,必须调整数据库连接字符串参数max pool size值为一个合适的值。这种情况一般较少见。
2: leaking connections问题导致。
其实这里个人理解为数据库连接没有正常关闭。有些是代码逻辑问题导致,有些是没有正确处理异常问题。