某医院客户一套.NET开发的应用,部署在Windows IIS 服务上,数据库是Oracle 12.1 RAC, 总是在早高峰时出现ORA-50012 Pooled connection request timed out的错误,困扰了客户好久,找到我们帮忙解决,下面简单记录。
应用日志
Oracle.Managed DataAccess, client,OracleException (0x80004005);: 0RA-50012: Pooled connection reauest timed out
+ oracleInternal.ConnectionPool.Poolmanager3.get()。。。
常见原因
连接数据耗尽或配置的最大连接不合理,或者是连接溢出
查看数据库连接串
connectionstring="data source=192.168.xxx/dbm;password=*****;persist security info=True;user id=his" />
并不是所有ora开头的报错都是数据库服务端的问题,客户反馈没有配置额外的中间件,从连接串中也没有看到connect pool。 首先排除使用了oracle 数据库服务端的connectpool.
SELECT * from cdb_cp_info;
Status=INACTIVE, 并没有使用数据库的connect pool。
ODP.NET 默认是用connect pool的, 连接串中可以指定参数,如果不指定也会有一些默认参数,常用的有:
POOLING:启用连接池 默认true
MAX POOL SIZE:连接池中CONNECTION最大数量 ,默认100
MIN POOL SIZE:连接池中CONNECTION最小数量 默认1
CONNECTION TIMEOUT:建立物理连接的超时时间,默认15s
查看了数据库的最大连接为1000,平时使用很少,以当时的连接频率即使使用短连接也没有任何问题。
解决方法
1, 加大connect pool 连接size
connectionstring=”…..Max Pool Size=500;Connection Timeout=30;”
或
2,禁用connect pool
不使用连接池(Pooling=FALSE)