java – JPA EntityManager大内存问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – JPA EntityManager大内存问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2945字,纯文字阅读大概需要5分钟。
内容图文
![java – JPA EntityManager大内存问题](/upload/InfoBanner/zyjiaocheng/966/920a7c1a9cdc41d790ad10969a323db4.jpg)
我遇到了使用Spring,Hibernate和JPA的Web应用程序的一些问题.问题是非常高的内存消耗,随着时间的推移而增加并且似乎永远不会减少.它们很可能源于EntityManager的错误使用.我已经四处寻找,但我还没找到确定的东西.
我们正在使用DAO,它们都扩展了以下GenericDAO,其中注入了我们的ONLY EntityManager:
public abstract class GenericDAOImpl<E extends AbstractEntity<P>, P> implements
GenericDAO<E, P> {
@PersistenceContext
@Autowired
private EntityManager entityManager;
[...]
使用通用DAO是因为它具有通过ID等获取实体的方法,这在所有~40个DAO中实现起来很麻烦.
EntityManager按以下方式配置为Spring bean:
<bean class="org.springframework.orm.jpa.JpaTransactionManager"
id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven mode="aspectj"
transaction-manager="transactionManager" />
<bean
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
id="entityManagerFactory">
<property name="persistenceUnitName" value="persistenceUnit" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="entityManager" factory-bean="entityManagerFactory"
factory-method="createEntityManager" scope="singleton" />
我认为最大的问题是使用这个共享的EntityManager来处理所有事情.在服务类中,我们对需要事务的方法使用@Transactional注释.这会从我读取的内容中自动刷新EntityManager,但确实与清除不同,所以我猜这些对象仍在内存中.
我们注意到每天在DB中自动导入数据后内存增加(每个25k行的~7个文件,其中创建了许多链接对象).但是在正常运行期间,当检索大量数据时(让我们说一次请求100-200个对象).
任何人都知道如何改善目前的情况(因为在这一点上它有点糟糕……)?
编辑:在部署的应用程序上运行了一个分析器,这就是它找到的内容:
One instance of "org.hibernate.impl.SessionFactoryImpl" loaded by "org.apache.catalina.loader.WebappClassLoader @ 0xc3217298" occupies 15,256,880 (20.57%) bytes. The memory is accumulated in one instance of "org.hibernate.impl.SessionFactoryImpl" loaded by "org.apache.catalina.loader.WebappClassLoader @ 0xc3217298".
这可能是EntityManager没有被清除?
解决方法:
我倾向于同意你的评估. EntityManagers aren’t really designed to be used as singletons.刷新EntityManager不会从内存中清除任何内容,它只会将实体与数据库同步.
可能发生的是EntityManager保持对持久化上下文中的所有对象的引用,并且您永远不会关闭上下文. (This guy有一个类似的问题.)清除它确实会删除EntityManager到你的实体的所有引用,但是,如果你发现自己经常不得不调用clear(),你应该重新评估你如何使用你的EntityManager.如果您只是想避免使用LazyInitializationExceptions,请考虑Spring *中的OpenSessionInViewFilter.这允许您懒惰地加载实体,同时仍让Spring管理bean的生命周期. bean的生命周期管理是Spring Framework的一大优势,因此您需要确保覆盖该行为才是您想要的.
在某些情况下,您确实需要一个长期存在的EntityManager,但这些情况相对较少,需要大量理解才能正确实现.
*注意:OpenSessionInView需要非常小心以避免N+1 problem.这是some call Open Session in View an AntiPattern这么大的问题.请谨慎使用.
编辑
此外,您也不需要使用@Autowired注释@PersistenceContext元素. @PersistenceContext自行完成布线.
内容总结
以上是互联网集市为您收集整理的java – JPA EntityManager大内存问题全部内容,希望文章能够帮你解决java – JPA EntityManager大内存问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。