2009-10-19 27 views
0

我一直在我的桌面上使用Hibernate + HSQLDB为我的应用程序开发数据库适配器。出于传统原因,这些ID由应用程序以字符串形式生成。所有工作都很好。休眠无法在大型数据库上启动

现在,我们有一个pre-prod数据库,有超过一百万条记录。我不得不在Hibernate方面做一些修改(例如标识符太长),但没有什么重要的。

也就是说,直到我解决了这个问题。当我尝试在预产品服务器上启动我的应用程序时,Hibernate开始创建一个gazillion查询,最终结束于OutOfMemoryError:Java堆空间。增加堆最大值没有帮助。

我禁用了C3PO缓存设置并禁用了hibernate.hbm2ddl.auto。我不知道为什么它正在做这些查询,我不知道如何禁用它们。

任何人都可以帮助我??????

+2

它正在执行什么样的查询? Hibernate不会自行查询,因为你的应用程序要求它发布它们。 – skaffman 2009-10-19 07:58:06

+0

你说得对。我在启动时做了一个虚拟查询,以确保我们触及了数据库。我删除了那个,我可以启动应用程序。但是这只是改变了问题,因为执行任何DB请求时,gazillion查询都会执行。 – malaverdiere 2009-10-19 08:33:03

回答

1

你告诉Hibernate热切地提取。所以当你加载第一个对象时,Hibernate也开始获取所有相关的对象。

您必须将所有不必要的关系设置为fetch=LAZY

+0

这很好。我禁用了所有的提取选项(因此让Hibernate用它的默认设置),我没有这种情况。 但是,我现在已经阻止了行为。 :( – malaverdiere 2009-10-19 09:31:21

+0

)你必须找到懒惰和渴望获取之间的平衡,并且你必须确保你使用了正确的事务嵌套,祝你好运调试这个,我通常会建议测试用例,但很难提出死锁测试。 – 2009-10-19 09:40:28