我所有的业务方法都会创建一个新的 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 文件。除了数据库连接信息之外,我并没有真正指定任何其他内容。
<?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 文件中设置哪些属性来限制最大缓存大小?我可以在全球范围内进行还是需要为每个实体类定义它?