在使用Oracle DB的Java Web应用程序中超过最大空闲时间

在使用Oracle DB的Java Web应用程序中超过最大空闲时间,java,oracle,apache-commons-dbcp,Java,Oracle,Apache Commons Dbcp,我有一个Java web应用程序连接到另一台机器上运行的Oracle数据库(不确定这是否相关)。我正在使用DBCP进行连接池。web应用程序在JBoss4.2.2中运行,我们在Spring中将数据源定义为bean 我们正在使用Hibernate进行ORM 我们偶尔会遇到这样的错误:“ORA-02396:超过最大空闲时间,请重新连接” 我曾尝试将名为“RemoveBandoned”(true)和“RemoveBandonedTimeout”(120)的属性添加到DBCP BasicDataSour

我有一个Java web应用程序连接到另一台机器上运行的Oracle数据库(不确定这是否相关)。我正在使用DBCP进行连接池。web应用程序在JBoss4.2.2中运行,我们在Spring中将数据源定义为bean

我们正在使用Hibernate进行ORM

我们偶尔会遇到这样的错误:“ORA-02396:超过最大空闲时间,请重新连接”

我曾尝试将名为“RemoveBandoned”(true)和“RemoveBandonedTimeout”(120)的属性添加到DBCP BasicDataSource中,但没有成功


任何帮助都将不胜感激。如果我需要提供更多信息,请告诉我-我对连接池等的内部工作原理不太了解。

在配置数据源时,请尝试将
testWhileIdle
属性设置为
true
。您还需要一个测试查询—对于Oracle,类似于
select1fromdail
的东西就足够了

这将提示dbcp轻推任何空闲连接以保持其新鲜

你也可以考虑删除连接,如果你不介意在他们需要以后重新创建它们。查看描述MineVictobleIdleTimeMillis、

timeBetweenEvictionRunsMillis
maxIdle
/
minIdle
属性的配置选项。请参阅上的此线程

用户要么切换到c3p0,要么将testWhileIdle属性添加到spring配置中:

<prop key="hibernate.dbcp.testWhileIdle">true</prop>

<prop key="hibernate.dbcp.validationQuery">
select 1 from dual
</prop>
true
从双重选择中选择1

我会切换到Oracle通用连接池库。它针对Oracle JDBC连接进行了优化,但如果您切换,它也可以与任何JDBC驱动程序一起使用。它也是JDBC4.0兼容的,并且实际上正在开发中。C3P0,Proxool,DBCP都是停滞的。它将通过对Oracle执行ping而不是查询来验证您的连接,这要快得多


可能值得向春季论坛海报指出——这是一个潜在的不安全验证查询。如果abc中有很多行,您就不想运行它。UCP是否可用于10g?是的,它适用于任何具有有效JDBC驱动程序实现的数据库。如果您使用的是Oracle驱动程序,它会使用一些特殊的技巧。