2008-12-17 38 views
2

那么,我们有一个运行在JBoss上的web应用程序,当试图在postgres数据库的多个表中插入很多行时,就会出现“OutOfMemory”错误。 这是此错误的完整环境:
* JBoss的4.3.x版GA
*的Java 1.6.0
*休眠3.0
* PostgreSQL的8.3(驾驶员)
关于实际代码的工作环境:
*关于这一点的重要部分是我们正在解析大量的xml文档,每个文档都从一个特定的URL(1 URL = 1 XML)分开下载。我们通过拥有一个将生成的URL分发到队列的EJB来实现这一点,然后一组MDB使用流连接并生成文档(请注意,由于XML文档的大小,我们实际上必须提高堆栈内存,而我们由于不得不将所有文档都放在一个流中),一旦生成文档,就会转到其他MDB池侦听的另一个队列。
那些MDB解析文档,将信息存储在几个实体中(至少5个),然后在DB中持久化(请注意事务管理设置为“BEAN”并且在每个MDB工作期间开始并提交)。处理URLs不是一个选项,因为要处理的URL的数量,这将需要大约2个月左右...大声笑
在Java中使用Postgres的内存不足

麻烦是......我们解析和存储像200个URL左右和开始解决postgreSQL的内存错误。 任何想法??

在此先感谢!

另外:它可能是有用的,知道这个错误没有出来之前(我解析了几千个XML的信息),只生成文件和解析它的一些实体似乎并没有带来麻烦。当我们开始将越来越多的文档解析为其代理实体时,麻烦就开始了。 (就像一个实体有一个“功能”列表[其他实体从同一个XML解析])

+0

当你说“失控的内存对于PostgreSQL”,你的意思是你的JBoss的情况下抛出一个异常,或者你的意思是PostgreSQL的后台程序本身运行内存? – 2008-12-17 13:23:49

+0

Java堆栈跟踪中显示异常,但我认为它是在PostgreSQL一侧生成的。 – 2008-12-17 13:33:47

回答

2

这听起来像你保留所有200文件在内存中的所有豆。

不是将所有数据全部保存在RAM中,而是尽可能快地将其清除。

因此,当您完成读取某些bean的数据时,坚持并忘记它(将对象引用设置为null),除了可能需要创建引用的键。

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

1

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

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

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