在jpa hibernate中扫描太多实体时,glassfish启动非常慢或内存泄漏

在jpa hibernate中扫描太多实体时,glassfish启动非常慢或内存泄漏,hibernate,java-ee-7,jpa-2.1,persistence.xml,payara,Hibernate,Java Ee 7,Jpa 2.1,Persistence.xml,Payara,我正在使用JavaEE7,hibernate-jpa2.1 我的项目有太多实体(大约2000个实体) 如果它只有100个对象实体,它将正常启动。 但是现在我已经添加了我所有的业务实体类(2000),我得到了一个pergem空间错误 2016-12-29T11:40:36.903+0700|Severe: Exception in thread "DynamicReloader" 2016-12-29T11:40:36.904+0700|Severe: java.lang.OutOfMe

我正在使用JavaEE7,hibernate-jpa2.1
我的项目有太多实体(大约2000个实体)
如果它只有100个对象实体,它将正常启动。
但是现在我已经添加了我所有的业务实体类(2000),我得到了一个pergem空间错误

 2016-12-29T11:40:36.903+0700|Severe: Exception in thread "DynamicReloader"
    2016-12-29T11:40:36.904+0700|Severe: java.lang.OutOfMemoryError: GC overhead limit exceeded
    2016-12-29T11:40:37.899+0700|Severe: Exception in thread "AutoDeployer"
    2016-12-29T11:40:37.900+0700|Severe: java.lang.OutOfMemoryError: GC overhead limit exceeded
我已经改进了jvm内存参数,但现在我的应用程序在启动过程中速度非常慢。
所以,我想知道是否有一些选项可以更快地加载这些实体? 提前感谢

这是示例实体

@Entity
@Table(name = "TBL_USER")
@NamedQueries({
        @NamedQuery(name = "TblUserO.findAll", query = "SELECT t FROM TblUserO t")
})
public class TblUserO implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "USER_ID", unique = true, nullable = false, precision = 11)
    private Long userId;
persistence.xml

     <persistence-unit name="c1spostgre1" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>jdbc/__PSG1</jta-data-source>
        <!-- Named JPQL queries per entity, but any other organization is possible -->
        <properties>
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
            <property name="hibernate.enable_lazy_load_no_trans" value="true"/>
            <!-- <property name="hibernate.archive.autodetection" value="class" /> -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL92Dialect" />
            <property name="hibernate.jdbc.batch_size" value="20" />
            <property name="hibernate.order_updates" value="true"/>
            <property name="hibernate.order_inserts" value="true"/>
        </properties>
    </persistence-unit>
    <persistence-unit name="c1spostgre2" transaction-type="JTA">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <jta-data-source>jdbc/__PSG2</jta-data-source>
        <properties>
            <property name="hibernate.transaction.jta.platform" value="org.hibernate.service.jta.platform.internal.SunOneJtaPlatform"/>
            <property name="hibernate.enable_lazy_load_no_trans" value="true"/>
            <!-- <property name="hibernate.archive.autodetection" value="class" /> -->
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQL92Dialect" />
            <property name="hibernate.jdbc.batch_size" value="20" />
            <property name="hibernate.order_updates" value="true"/>
            <property name="hibernate.order_inserts" value="true"/>
        </properties>
    </persistence-unit>

org.hibernate.jpa.HibernatePersistenceProvider
jdbc/uuu PSG1
org.hibernate.jpa.HibernatePersistenceProvider
jdbc/uuu PSG2

您已经增加了足够的堆内存(而不是permgen),这样您的应用程序现在就可以启动了,但是由于需要加载到内存中的内存太多,您几乎肯定会在加载这些内存的同时进行大量垃圾收集,这将导致速度减慢。听起来你需要对你的应用程序进行广泛的性能调整,但这远远超出了StackOverflow问题的范围。

你已经增加了足够的堆内存(而不是permgen),因此你的应用程序现在可以启动了,但是,由于需要加载到内存中的内容太多,几乎可以肯定,在加载所有这些内容的同时,您会进行大量的垃圾收集,这将导致速度减慢。听起来您需要对应用程序进行广泛的性能调整,但这远远超出了StackOverflow问题的范围。

您的应用程序似乎在启动时从数据库加载了太多数据。我的猜测是,额外的实体有太多的急切关系,应用程序为它需要做的事情加载了太多不必要的数据

我建议查看实体映射,并尽可能地将多个关系减少为lazy(尤其是*ToMany关系都应该是lazy抓取的,这是默认设置)。在搜索加载了哪些不必要的数据时,可以打开SQL查询的日志记录,以检测用于加载数据的SQL脚本。您的应用程序可能正在将某些表中的所有实体加载到内存中,然后对它们进行筛选,这是不高效的


您应该重新考虑将过滤放入JPQL查询中。在调用
getResultList()

之前,还应该减少findAll查询的使用,或者至少使用
setMaxResult()
限制检索到的实体的数量。应用程序在启动时似乎从数据库加载了太多数据。我的猜测是,额外的实体有太多的急切关系,应用程序为它需要做的事情加载了太多不必要的数据

我建议查看实体映射,并尽可能地将多个关系减少为lazy(尤其是*ToMany关系都应该是lazy抓取的,这是默认设置)。在搜索加载了哪些不必要的数据时,可以打开SQL查询的日志记录,以检测用于加载数据的SQL脚本。您的应用程序可能正在将某些表中的所有实体加载到内存中,然后对它们进行筛选,这是不高效的

您应该重新考虑将过滤放入JPQL查询中。在调用
getResultList()
之前,还应该减少findAll查询的使用,或者至少使用
setMaxResult()
限制检索到的实体的数量