私のすべてのビジネスメソッドは、新しいEntityManagerを作成し、finallyブロックで明示的に閉じます。
EntityManagerFactory entityManagerFactory = PersistenceManager.getInstance().getEntityManagerFactory(); //Singleton
EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
em.persist(someEntity);
tx.commit();
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (em!=null) {
em.close();
}
}
非常に基本的なpersistence.xmlファイルが定義されています。DB接続情報以外は実際には指定していません。
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="db" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>package.class</class>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.logging.level" value="INFO" />
<property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" />
<property name="javax.persistence.jdbc.url"
value="url" />
<property name="javax.persistence.jdbc.user" value="scott" />
<property name="javax.persistence.jdbc.password" value=tiger" />
</properties>
</persistence-unit>
</persistence>
アプリケーションで見られる動作は、割り当てられたメモリが増加し始め、メモリエラーが発生し始める時点まで最終的に最大制限に達することです。しばらくすると、これらのエラーはクリアされ、JVMに割り当てられたヒープは最大値の約95%に戻ります。確認用のプロファイラーを取り付けていませんが、この時点でGCが発生すると想定しています。
これはデフォルトの動作と見なされますか?キャッシュを調整するためのベストプラクティスのいくつかは何ですか。最大キャッシュサイズを制限するために、persistence.xmlファイルにどのようなプロパティを設定できますか?グローバルに実行できますか、それともエンティティクラスごとに定義する必要がありますか?