小编Mei*_*ini的帖子

使用JPA将包括关系的整个表加载到内存中

我必须处理分布在20个表中的大量数据(总结约500万条记录),我需要有效地加载它们.

我正在使用Wildfly 14和JPA/Hibernate.

最后,每个记录都将被业务逻辑使用(在同一个事务中),我决定通过以下方式将所需表的全部内容预加载到内存中:

em.createQuery("SELECT e FROM Entity e").size();
Run Code Online (Sandbox Code Playgroud)

之后,每个对象都应该在事务中可用,因此可以通过以下方式获得:

em.find(Entity.class, id);
Run Code Online (Sandbox Code Playgroud)

但是这在某种程度上不起作用,并且仍然有很多对DB的调用,特别是对于关系.

我怎样才能有效地加载所需表格的全部内容,包括关系,并确保我得到了所有内容/没有进一步的数据库调用?

我已经尝试过的:

  • FetchMode.EAGER:仍有太多的单选/对象图太复杂了
  • EntityGraphs :与FetchMode.EAGER相同
  • 加入fetch语句:迄今为止的最佳结果,因为它同时填充了与引用实体的关系
  • 第二级/查询缓存:不工作,可能与问题相同em.find

需要注意的一点是,数据是不可变的(至少在特定时间内),也可以用于其他事务.

编辑:

我的计划是加载和管理@Singletonbean中的整个数据.但我想确保以最有效的方式加载它并确保加载整个数据.当业务逻辑使用数据时,不应该有进一步的查询.在特定时间(ejb计时器)之后,我将丢弃整个数据并从DB重新加载当前状态(总是整个表).

java hibernate jpa java-ee wildfly

7
推荐指数
3
解决办法
668
查看次数

标签 统计

hibernate ×1

java ×1

java-ee ×1

jpa ×1

wildfly ×1