在我的桌面应用程序中,新数据库经常被打开。我使用Hibernate
/JPA
作为 ORM。问题是,创建EntityManagerFactory
速度很慢,在快速机器上大约需要 5-6 秒。我知道它EntityManagerFactory
应该是重量级的,但这对于用户希望快速打开新数据库的桌面应用程序来说太慢了。
我可以关闭一些 EntityManagerFactory 功能以更快地获取实例吗?或者是否可以懒惰地创建一些 EntityManagerFactory 来加快创建速度?
我可以在知道数据库 url 之前以某种方式创建 EntityManagerFactory 对象吗?我很乐意关闭所有验证以使其成为可能。
通过这样做,我可以汇集 EntityManagerFactorys 供以后使用吗?
还有其他想法如何更快地创建 EntityManagerFactory 吗?
更新更多信息和 JProfiler 分析
桌面应用程序可以打开保存的文件。我们的应用程序文档文件格式由 1 个 SQLite 数据库 + 和 ZIP 文件中的一些二进制数据组成。打开文档时,会提取 ZIP 并使用 Hibernate 打开数据库。数据库都具有相同的架构,但显然不同的数据。
似乎我第一次打开文件所需的时间比以下时间长得多。我使用 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 类还是我的 Entity 类。
第一个改进是在应用程序启动后立即创建一个 EMF,以初始化所有必要的类(我有一个空的 db 文件作为我的应用程序附带的原型)。@sharakan 感谢您的回答,也许 DeferredConnectionProvider 已经可以解决此问题。
接下来我将尝试 DeferredConnectionProvider!但我们也许可以进一步加快速度。你还有什么建议吗?