首页 > spring 调用存储过程,返回游标,当游标数据超过连接池指定大小后连接池就爆了

spring 调用存储过程,返回游标,当游标数据超过连接池指定大小后连接池就爆了

1、oracle中一个存储过程收集数据,然后保存至out游标。
2、通过spring调用该存储过程,并返回数据。
3、逻辑处理类继承自StoredProcedure。
4、当游标数据超过连接池指定大小后连接池就爆了。

/*
*在spring调用存储过程的代码中,自始至终没见到有需要控制连接池的地方,比如open和close。
*/

---------------------以下是连接池配置相关参数--------------------------
maxActive=50
maxWait=20000
maxIdle=5

---------------------以下是报错信息-----------------------------------
Caused by: org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool exhausted

at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:103)
at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:540)
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:81)
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:417)
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:144)
at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)
at org.hibernate.loader.Loader.doQuery(Loader.java:661)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
at org.hibernate.loader.Loader.doList(Loader.java:2145)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:392)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:333)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1109)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
at org.springframework.orm.hibernate3.HibernateTemplate$31.doInHibernate(HibernateTemplate.java:853)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366)
... 82 more

Caused by: java.util.NoSuchElementException: Timeout waiting for idle object

at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:801)
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:95)

spring会自己控制连接池的open和close。
正常来说游标数据跟连接池大小没关系的。应该是代码问题,好好检查下代码。
实在不行直接jdbc调用存储过程。手动控制连接的打开和关闭。

【热门文章】
【热门文章】