我正在构建一个小型的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,但它更糟糕。
1条答案
按热度按时间lsmepo6l1#
我觉得这很正常。这需要时间。这对你来说真的是个问题吗?
Hibernate Session Factory taking long time to load
SessionFactory是一个创建成本很高的ThreadSafe对象,旨在由所有应用程序线程共享。它通常在应用程序启动时从配置示例创建一次。