Caching 指定EclipseLink 2.0.2最大缓存大小以防止其增长到消耗所有可用JVM堆的方法

Caching 指定EclipseLink 2.0.2最大缓存大小以防止其增长到消耗所有可用JVM堆的方法,caching,jpa-2.0,eclipselink,Caching,Jpa 2.0,Eclipselink,我的所有业务方法都会创建一个新的EntityManager,并在finally块中显式关闭它们 EntityManagerFactory entityManagerFactory = PersistenceManager.getInstance().getEntityManagerFactory(); //Singleton EntityManager em = entityManagerFactory.createEntityManager();

我的所有业务方法都会创建一个新的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>

org.eclipse.persistence.jpa.PersistenceProvider
包类
假的

如果不使用探查器查看内存,很难说出内存中保存的内容。最常见的原因通常是在不清除EntityManager的情况下重用EntityManager,因为除非清除,否则EntityManager需要保留每个托管实体的生命周期。您没有使用显示的用于持久化实体的代码来执行此操作,但您没有显示如何读取实体,因此这可能是可能的,并且在用户自己管理实体管理器而不是让容器为其执行此操作时更为常见

回答关于EclipseLink缓存的问题:EclipseLink有一个第二级缓存,可以保存在内存中。这里显示了不同的缓存类型和选项 默认情况下,它使用SoftweakEntityMap,它有两个部分;使用软引用的缓存和使用弱引用的标识映射。如果应用程序不再被引用,软引用允许对对象进行垃圾收集,并且默认情况下每个描述符的大小为100

本页将讨论JPA的缓存选项 您可以关闭共享缓存,看看这是否有助于您的应用程序。不过,我会很惊讶这会有所帮助。您提到,在垃圾回收发生后,95%的应用程序内存仍然保留,这表明应用程序仍然有对资源的引用


不过,我建议您检查内存中保存的内容,并评估应用程序中是否存在问题,或者您的应用程序需要的内存量是否大于配置的内存量。

就读取而言,除了查询不是在事务上下文中执行之外,我正在做完全相同的事情。我将附加一个剖析器,看看下一步可能会发生什么。