Spring、HibernateおよびJPAを使用するWebアプリケーションに問題が発生しました。問題は時間の経過と共に増加する非常に高いメモリ消費であり、決して減少しないように見える。 EntityManagerの使い方が間違っている可能性が高いです。私は周りを検索したが、私は確かに何かをまだ見つけていない。JPA EntityManagerの大きなメモリの問題
我々はすべて私たちの唯一のEntityManagerが注入され、次のGenericDAOを拡張するのDAOを使用している:
public abstract class GenericDAOImpl<E extends AbstractEntity<P>, P> implements
GenericDAO<E, P> {
@PersistenceContext
@Autowired
private EntityManager entityManager;
[...]
それがIDでエンティティを取得するためのメソッドを持っているので、痛みになりますどのので、ジェネリックDAOが使用されていますすべて〜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のがクリアされていない、おそらくですか?
'PersistenceContext'を使用している間、私は' spring'と 'hibernate'と同じ問題を抱えているない真のJEEアプリケーションサーバです。あなたは漏れを解決しましたか? – oak