4

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

我们将 Hibernate 用于 ORM。

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

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

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

4

3 回答 3

7

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

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

如果您不介意以后需要重新创建它们,您还可以考虑驱逐空闲的连接。查看描述,和/属性的配置选项的文档。minEvictableIdleTimeMillistimeBetweenEvictionRunsMillismaxIdleminIdle

于 2009-10-15T17:12:02.907 回答
0

请参阅春季论坛上的此主题。

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

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

<prop key="hibernate.dbcp.validationQuery">
select 1 from dual
</prop>
于 2009-10-15T17:13:17.020 回答
0

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

甲骨文UCP

于 2009-10-15T17:22:46.210 回答