【问题标题】:JPA entity model best practicesJPA 实体模型最佳实践
【发布时间】:2011-11-02 13:15:34
【问题描述】:

我们试图找出内存泄漏,现在我们正在考虑实体模型的大小和实体之间的关系。我们使用 EclipseLink 2.0.2 作为在 WebLogic 10.3.3 中运行的 JPA 提供程序。

我们的模型包含 162 个实体。这些并非都直接相互连接,但您可以通过传递关系从一个起始实体导航到任意其他实体。除一对一之外的所有关联都是延迟加载的。

那么,您最大的实体模型是什么?您是否考虑过任何内存泄漏或其他有线行为?您对设计实体模型有什么建议吗?您是否遇到过导致问题的常见模式?

【问题讨论】:

  • 你的问题太宽泛了。 162不是一个小数字,也不是一个很大的数字。以最自然的方式设计您的模型,并确保大多数关联是惰性的,以避免在每个事务中加载一半的数据库。
  • 内存消耗是否随着时间的推移而增加,或者它“只是”太高了? EntityManager 中的实体数量是否会随着时间增加?
  • PermGen 消耗随着时间的推移而增加。如何找出由实体管理器管理的实体数量。由于我们使用的是容器管理的持久性,我假设每次调用后都会清除 em。
  • 您是否做过堆分析以查看堆中的对象类型和数量?我建议将 JRockit JVM 与 Mission Control 一起使用。 Mission Control 会让你看到大量的信息(类似于 jvisualvm,但比 jvisualvm 更好)

标签: java jpa weblogic eclipselink


【解决方案1】:

当你用完内存时你得到什么错误,是堆还是perm?您是否尝试过增加堆或烫发大小?

内存用完需要多长时间?

您是如何配置缓存的,您是否尝试禁用缓存 (shared=false) 以确定这是否与您的内存问题有关。

您是通过请求还是通过静态方法在应用程序中保留对域对象的引用。您是否长期使用 EntityManager。

通常调试内存问题的最佳方法是使用内存分析器,例如 JProfiler。

【讨论】:

  • jvisualvm(从 1.6 开始包含在 Oracle JVM 中)对于探索内存问题也很有用 - 您可能已经拥有它。
  • 实际上我们两者都用;-)。事实证明,perm gen 消耗不会随着时间的推移而增加,但如果 perm gen 已满,gc 会释放占用的空间。好问题我会在接下来的几天里弄清楚更多细节。
猜你喜欢
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-01
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多