gpt4 book ai didi

oracle - tomcat 6 dbcp 和 oracle 11 瘦驱动程序的堆空间不足

转载 作者:行者123 更新时间:2023-11-28 22:33:04 26 4
gpt4 key购买 nike

我在 Tomcat 6 上运行一个 Web 应用程序,使用 Tomcat DBCP 来管理 JDBC 连接。该应用程序可以与 MySQL、SQL Server 一起运行,我们最近开始针对 Oracle 进行测试。与 MySQL 和 SQL Server 不同,当我们开始使用 Oracle 瘦驱动程序时,我们的应用程序开始使用无限的内存。

该应用程序在 Windows 2008 服务器上运行,并安装了 Oracle 11g。 Tomcat 作为服务运行,最大内存为 2 GB,-XX:MaxPermSize=1024m,最大线程堆栈大小为 1024k。 DBCP 设置的最大事件数为 20,最大空闲数为 10。继续运行一段时间,它将占用所有 2 个演出并开始报告:

java.lang.OutOfMemoryError: Java 堆空间

我们对 JDBC 的使用非常初级。我们从 JDBC 数据源获取连接,执行查询或更新,然后对结果、语句和连接(如果存在)调用 close()。

当使用 MySQL 5 驱动程序或 JTDS 驱动程序运行时,我们可以在不到 1 GB 的内存中运行。唯一的区别是 Oracle 驱动程序。

我能做些什么来阻止它?

更新(2011 年 3 月 30 日):我在下面添加了评论作为回复。谁能帮忙?

以下是对评论的回答:

The database is not on the same server as Tomcat. The server hosting Tomcat has 8 gigs of physical memory.

I do not close the connection after each use. I am using Tomcat's DBCP, and I do call close() after each use, but pool is set to a max active of 20, max idle of 10.

The version I am running of the thin driver is 11.2.0.2.0.

As for the -Xmx, I am running this as a service, with the "Initial memory pool" of 1024MB, the "Maximum memory Pool" of 2048MB, and the "Thread stack size" of 1024KB

I don't have a stack trace - there is no error until the out of memory error (with no stack trace).

最佳答案

这个答案可能会很晚,但发布是为了帮助可能遇到类似情况的其他人。

每当使用 JDBC 的应用程序运行期间遇到 OOME(OutOfMemoryError)时,获取堆转储或多或少有助于解决问题的根本原因。在某些情况下,OOME 是自然抛出的,没有任何潜在的泄漏。这是由于堆本身已耗尽。当JDBC Statement 执行返回一个大的结果集时,可能会遇到这种情况。

Oracle JDBC 驱动程序在创建结果集时创建的对象显然很重,甚至是短暂的(对于大多数应用程序来说,在获取所需数据后不会保留对结果集的引用)。返回一个大数据项(大量的行或列)必然会导致这种情况。

如果是这种情况,唯一可用的解决方案是:

  • 增加 Java 堆可用的内存量。
  • 如果可能,重写查询以返回较小的数据集。

可能还有其他潜在问题,但这些问题已经在其他问题中进行了足够详细的处理 - 例如,关闭结果集、语句和逻辑连接对象等。

关于oracle - tomcat 6 dbcp 和 oracle 11 瘦驱动程序的堆空间不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5412992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com