问题描述
我使用JavaFX应用程序工作了几年,目前由应用程序管理的JPA EntityManager,其中Hibernate 5.4.19.Final
作为JPA实现,MySQL 8
或MS 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 (将#修改为@)