hibernate Persistence.createEntityManager工厂初始启动太慢

yx2lnoni  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(137)

我正在构建一个小型的JavaFX桌面应用程序。
有两个独立的DBS。其中一个有两个具有一对多关系的表。
我使用的是JPA,其中嵌入了Hibernate和Apache Derby作为数据库。我使用的是所有依赖项的最新版本。
我使用‘MVN Compile Package’命令部署应用程序,使用‘maven-shade-plugin’。
我遇到的问题是,Persistence.createEntityManagerFactory需要6秒以上的时间才能从胖jar启动。(从IntelliJ开始需要2秒,这是可以接受的)
这是我的Persistence.xml文件:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
         http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"
         version="2.1">

<persistence-unit name="tm_persistence" transaction-type="RESOURCE_LOCAL">
    <description>TimeMeasurement Hibernate EntityManager</description>
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>com.nick.timemeasurementfx.Model.TmHeader</class>
    <class>com.nick.timemeasurementfx.Model.TmDetail</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
        <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:derby:db/timemeasurement"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="show_sql" value="true"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.persistence.jdbc.password" value="root"/>
    </properties>
</persistence-unit>

<persistence-unit name="za_persistence" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <class>com.nick.timemeasurementfx.Model.Za</class>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>

    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.DerbyDialect"/>
        <property name="hibernate.connection.driver_class" value="org.apache.derby.jdbc.EmbeddedDriver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:derby:db/zadata"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
        <property name="show_sql" value="true"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.persistence.jdbc.password" value="root"/>
    </properties>
</persistence-unit>

这就是我创建EntityManager的方式:EntityManager和EntityManagerFactory来自jakarta.Persistence。

public class EntityManagerTM {
private static final EntityManagerFactory entityManagerFactory;

static {
    try {
        long start = (new Date()).getTime();
        entityManagerFactory = Persistence.createEntityManagerFactory("tm_persistence");
        long end = (new Date()).getTime();
        System.out.println("++ TM it took "+(end-start)+" to create EM Factory");
    } catch (Throwable ex) {
        System.err.println("Initial SessionFactory creation failed." + ex);
        throw new ExceptionInInitializerError(ex);
    }
}

public static EntityManager getEntityManager() {
    long start = (new Date()).getTime();
    EntityManager em = entityManagerFactory.createEntityManager();
    long end = (new Date()).getTime();
    System.out.println("++ TM it took "+(end-start)+" to create entity manager");
    return em;
}

}
有什么方法可以更快地创建EntityManagerFactory吗?
当应用程序启动时,我可以在单独的线程中创建这两个EntityManager工厂吗?(我假设当应用程序加载时,EntityManagerFactory也会创建,然后只是为了使用它们)
尼克
另外,我尝试了很多我在网上找到的不同的建议/解决方案,但都没有帮助我减少时间。我尝试使用H2而不是ApacheDerby,但它更糟糕。

lsmepo6l

lsmepo6l1#

我觉得这很正常。这需要时间。这对你来说真的是个问题吗?
Hibernate Session Factory taking long time to load
SessionFactory是一个创建成本很高的ThreadSafe对象,旨在由所有应用程序线程共享。它通常在应用程序启动时从配置示例创建一次。

相关问题