在Java中使用Postgres的内存不足

时间:2008-12-17 13:04:01

标签: java postgresql memory

好吧,我们有一个运行在JBoss上的Web应用程序,当我尝试在postgres DB的几个表中插入大量行时,我们遇到了“OutOfMemory”错误。 这是此错误的完整环境:
* JBoss 4.3.x GA
* Java 1.6.0
* Hibernate 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带来内存不足错误。 任何想法??

提前致谢!!

另外:知道之前没有出现过这个错误(我确实解析了几千个XML)可能会有用,只生成文档并将其中的一些解析为某些实体似乎没有带来麻烦。当我们开始将越来越多的文档解析为它的通信实体时,麻烦就开始了。 (就像一个具有“特征”列表的实体[从同一个xml解析的其他实体])

2 个答案:

答案 0 :(得分:2)

听起来你把所有200个文件都留在内存中。

不要一直将所有数据保存在RAM中,而是尽快摆脱它。

因此,当您完成读取某些bean的数据时,请将其保留,然后将其遗忘(将对象引用设置为null),除非您需要创建引用所需的密钥。

如果您不能这样做,请使用分析器确保在解析文档后不保留对文档的引用。通常,在将文档保存在数据库中后,您无需将整个文档保留在任何位置。如果这是一个问题,请创建一个带引用的表,该表允许您在文档之间进行链接,并将该表中的键保留在内存中(而不是整个文档中)。

答案 1 :(得分:1)

简短的回答是需要更多信息。我建议使用像JProfiler这样的工具来帮助了解内存消耗的位置。

根据您描述的设计:为什么要使用两个池?如果您只有一个URL池,那么工作线程可以从该池中提取,解析URL并创建实体bean,将它们保存到DB。

目前尚不清楚为什么需要中间XML步骤,这听起来像是高内存消耗的可能来源。