在JPA JavaSE应用程序中启用延迟实体加载

问题描述

我使用JavaFX应用程序工作了几年,目前由应用程序管理的JPA EntityManager,其中Hibernate 5.4.19.Final作为JPA实现,MySQL 8MS SQL Server 2008作为数据库,HikariCP 3.2.0作为数据库连接池。它在AdoptOpenJDK的JDK 11.0.8+10上运行。第二级缓存未实现,因为同一数据库上有多个应用程序实例在运行,以使所有应用程序上的数据保持一致(将来可能会更改为客户端服务器体系结构)。

该应用程序是多线程的,并且在执行程序服务中运行JavaFX任务和JavaFX服务,默认情况下该执行程序服务限制为15个线程。任务和服务都使用JPA访问底层数据库。

通过一个非常基本的DAO处理数据库访问,该DAO实现了CRUD功能。 DAO在正在打开EntityManagerFactory的DAO工厂之上构造。对于每个线程,都将构造一个新的DAO,DAO工厂在ConcurrentHashMap<Thread,DAO> DAOS中跟踪DAO。 DAO工厂在打开新的DAO之前检查线程是否已死。在这种情况下,DAO工厂将通知DAO关闭EntityManager(如果已打开)并从DAO工厂的地图DAOS中删除。

在DAO的每个CRUD操作上,都会构造EntityManager并在操作完成后将其关闭。 DAO上的通常操作是将数据加载到JavaFX TableView,就像Task<MyEntityWrapper>一样,通过onSucceeded处理程序将数据提供给TableView。该任务由执行程序服务运行。 MyEntityWrapper正在包装DAO中的MyEntity对象。

在某些情况下,实体也通过Task交还给onSucceeded处理程序。

我注意到,这种方法适用于没有两个或多个实体之间的关联的简单实体,但是在用LazyInitializationException延迟加载关联实体时失败。 我必须使用FetchType.EAGER加载所有关联的实体,这似乎会降低性能。

我在HikariCP中禁用了自动提交,设置了批处理大小,设置了订单插入和更新,并在不需要Hibernate进行写访问的查询中设置了只读提示,以提高性能。

是否可以在此应用程序上启用延迟加载?

是否有我想提高性能的Hibernate配置调整或最佳实践?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)