2009-10-15 81 views
3

我有一个Java Web应用程序连接到在另一台机器上运行的Oracle数据库(不确定这是否相关)。我正在使用DBCP进行连接池。 Web应用程序在JBoss 4.2.2中运行,我们在Spring中将我们的数据源定义为一个bean。使用Oracle DB在Java Web应用程序中超过最大空闲时间

我们使用Hibernate for ORM。

偶尔会出现如下错误:“ORA-02396:超出最大空闲时间,请重新连接”。

我曾尝试将属性添加到我们的DBCP BasicDataSource名为“removeAbandoned”(true)和“removeAbandondedTimeout”(120)无济于事。

任何帮助,将不胜感激。如果我需要提供更多的信息,请告诉我 - 我并不全都知道连接池的内部工作等等。

回答

7

尝试在配置数据源时将testWhileIdle属性设置为true。你还需要一个测试查询 - 对于Oracle,像select 1 from dual就足够了。

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

如果您以后不需要重新创建它们,您也可以考虑将连接变为空闲状态。请查看描述minEvictableIdleTimeMillis,timeBetweenEvictionRunsMillismaxIdle/minIdle属性的配置选项的documentation

0

spring forums上查看此线程。

在使用者要么最终切换到C3P0或添加testWhileIdle属性到弹簧配置:

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

<prop key="hibernate.dbcp.validationQuery"> 
select 1 from dual 
</prop> 
+1

可能是值得指出的弹簧论坛海报 - 这就是潜在的不安全的验证查询。如果abc中有很多行,你不想运行它。 – serg10 2009-10-15 17:24:59

0

我会切换到Oracle通用连接池库。它针对Oracle JDBC连接进行了优化,但如果您切换,也可以与任何JDBC驱动程序一起使用。它也符合JDBC 4.0,并且正在进行中。 C3P0,Proxool,DBCP都是停滞不前的。它会通过对Oracle执行ping来验证连接,而不是查询也更快。

Oracle UCP

+0

UCP是否可用于10g? – Rintoul 2009-10-15 20:14:24

+0

是的,它适用于任何具有有效JDBC驱动程序实现的数据库。如果您碰巧使用Oracle驱动程序,只需使用一些特殊的技巧。 – Gandalf 2009-10-15 20:15:06

相关问题