休眠更快的实体管理器工厂创建
在我的桌面应用程序中,新数据库经常被打开。我使用 / 作为 ORM。问题是,创建速度非常慢,在快速的机器上大约需要5-6秒。我知道应该是重量级的,但这对于桌面应用程序来说太慢了,用户希望快速打开新数据库。Hibernate
JPA
EntityManagerFactory
EntityManagerFactory
-
我可以关闭一些EntityManagerFactory功能以更快地获取实例吗?或者是否可以懒惰地创建一些EntityManagerFactory以加快cration速度?
-
我可以在知道数据库网址之前以某种方式创建EntityManagerFactory对象吗?我很乐意关闭所有验证,以便实现这一点。
-
通过这样做,我可以汇集EntityManagerFactorys供以后使用吗?
-
任何其他想法如何更快地创建EntityManagerFactory?
使用更多信息和JProfiler分析进行更新
桌面应用程序可以打开保存的文件。我们的应用程序文档文件格式包含1个SQLite数据库+和ZIP文件中的一些二进制数据。打开文档时,将提取 ZIP,并使用休眠打开 db。数据库都具有相同的架构,但数据明显不同。
似乎我第一次打开文件时花费的时间比以下时间长得多。我用JProfiler分析了第一次和第二次运行,并比较了结果。
第一次运行:
create EMF: 4385ms
build EMF: 3090ms
EJB3Configuration configure: 900ms
EJB3Configuration <clinit>: 380ms
.
第二次运行:
create EMF: 1275ms
build EMF: 970ms
EJB3Configuration configure: 305ms
EJB3Configuration <clinit>: not visible, probably 0ms
.
在调用树比较中,您可以看到某些方法明显更快(以 DatabaseManager. 为起点):
create EMF: -3120ms
Hibernate create EMF: -3110ms
EJB3Configuration configure: -595ms
EJB3Configuration <clinit>: -380ms
build EMF: -2120ms
buildSessionFactory: -1945ms
secondPassCompile: -425ms
buildSettings: -346ms
SessionFactoryImpl.<init>: -1040ms
热点比较现在有有趣的结果:
.
ClassLoader.loadClass: -1686ms
XMLSchemaFactory.newSchema: -184ms
ClassFile.<init>: -109ms
我不确定是加载Hibernate类还是我的实体类。
第一个改进是在应用程序启动时立即创建一个EMF,只是为了初始化所有必要的类(我有一个空的db文件作为原型已经随我的应用程序一起提供)。@sharakan感谢您的回答,也许延期连接提供者已经是这个问题的解决方案。
接下来我会尝试延期连接提供器!但我们也许能够进一步加快速度。您还有其他建议吗?