java - 使用关联时,使用 eclipselink/jpa 加载大型数据库表需要非常长的时间

标签 java sqlite jpa eclipselink

我正在使用 JPA/EclipseLink 2.5.2 从 SQLite 数据库加载两个数据库表。有两张表:一张名为 Dwellings,具有 PK housingId 和一些其他字段,一张名为 Households,具有 PK familyId、FK housingId 和一些其他字段。

持久化类看起来像这样:

@ReadOnly
@Entity
@Table(name="Dwellings")
@NamedQuery(name = "Dwelling.findAll", query = "SELECT d FROM Dwelling d")
public class Dwelling implements Serializable {
     private static final long serialVersionUID = -2430404920797112159L;

    @Id
    private int dwellingId;

    @OneToOne(mappedBy="dwelling", optional=true, cascade=CascadeType.ALL)
    private Household household;

    (...)
}

@ReadOnly
@Entity
@Table(name="Households")
@NamedQuery(name="Household.findAll", query="SELECT h FROM Household h")
public class Household implements Serializable {
    private static final long serialVersionUID = -360339872479840811L;

    @Id
    private int householdId;

    @OneToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(name = "DwellingId")
    private Dwelling dwelling;

    (...)
}

现在,如果我在未启用关联的情况下加载包含约 900,000 行的表格住宅(使用下面的命令),整个加载将花费大约 10 秒。

TypedQuery<Dwelling> dwellingQuery = entitymanager.createQuery("select d from Dwelling d", Dwelling.class);
List<Dwelling> dwellings = dwellingQuery.getResultList();

如果我启用两个表之间的关联(包含约 800.000 行的家庭),加载将需要很长时间(我在约 10 分钟后中断了它)。

我在 Households.dwellingId 列上放置了一个索引。

我还可以尝试什么来加快关联查找速度?

最佳答案

也许它与 ORM n+1 performance problem. 相关

关于java - 使用关联时,使用 eclipselink/jpa 加载大型数据库表需要非常长的时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28028516/

相关文章:

java - JTable 未正确返回所选行

java - 如何使用 jsoup 从网页中的所有段落中提取完整 URL

java - 从文件读取列表时发生类转换异常

java - 区分配置更改和真正关闭,在 DialogFragment 的 onDimiss 回调中

delphi - DBGrid 显示 "(MEMO)"作为字符串字段的值

SQLite 返回单行,即使我没有使用 GROUP BY

java - 在 Gson 的帮助下将 java 对象存储为共享首选项,而不是使用 SQLite? (安卓)

java - 即时更改数据库列类型

xml - JAXB 和 JPA 将数据保存在数据库中

java - Hibernate:覆盖实体getter以添加注释