【发布时间】:2008-12-17 13:04:00
【问题描述】:
好吧,我们有一个运行在 JBoss 上的 Web 应用程序,当尝试在 postgres 数据库的多个表中插入大量行时,我们遇到了“OutOfMemory”错误。
这是此错误的完整环境:
* JBoss 4.3.x 正式版
* Java 1.6.0
* 休眠 3.0
* postgreSQL-8.3(驱动程序)
关于实际的代码工作环境:
* 关于这一点的重要部分是我们正在解析大量的 xml 文档,每个文档都是从特定的 URL 单独下载的(1 个 URL = 1 个 XML)。我们通过使用 EJB 将生成的 URL 分发到队列中来实现这一点,然后 MDB 池使用流连接并生成文档(请注意,由于 XML 文档的大小,我们实际上不得不增加堆栈内存,而且我们正在坚持必须在一个流中获取所有文档),一旦生成文档,它就会进入另一个队列,另一个 MDB 池在该队列中侦听。
这些 MDB 解析文档,将信息存储在几个实体(至少 5 个)中,然后持久保存在数据库中(请注意,事务管理设置为 "BEAN" 并在每个 MDB 期间开始和提交工作)。按顺序处理 URL 不是一种选择,因为要处理的 URL 数量很多,大约需要 2 个月左右...lol
问题是......我们解析和存储了大约 200 个 URL,然后开始出现 postgreSQL 的内存不足错误。 有什么想法吗??
提前致谢!!
ALSO:知道这个错误之前没有出现(我之前确实解析了数千个 XML)可能是有用的,只生成文档并将其中的一些解析为某些实体似乎并没有带来麻烦。当我们开始将越来越多的文档解析为其对应的实体时,麻烦就开始了。 (就像一个实体有一个“特征”列表[从同一个 xml 解析的其他实体])
【问题讨论】:
-
当您说“postgreSQL 内存不足”时,您的意思是您的 jboss 实例抛出了异常,还是您的意思是 PostgreSQL 守护进程本身内存不足?
-
Java Stack Trace 中显示了异常,但我认为它是在 PostgreSQL 端生成的。
-
您在 PostgreSQL 守护进程的日志文件中看到什么了吗?至少发布您看到的堆栈跟踪。
-
实际上,这是堆栈跟踪的第一行:11:36:17,730 WARN [PersistenceManager] SQLException catched - 假设检测到死锁,try:4 java.sql.SQLException: out of memory
-
服务器上的 PostgreSQL 日志没有显示任何异常,但我读到 PostgreSQL 驱动程序在服务器端和客户端都保持游标......我不确定。
标签: java postgresql memory