使用关联 eclipselink/jpa 加载大型数据库 table 需要很长时间
Loading a large database table using eclipselink/jpa takes extremely long when using associations
我正在使用 JPA/EclipseLink 2.5.2 从 SQLite 数据库加载两个数据库 table。有两个 table:一个名为 Dwellings,具有 PK dwellingId 和一些其他字段,一个名为 Households,具有 PK householdId、FK dwelllingId 和一些其他字段。
持久性 类 看起来像这样:
@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 行的 table 住宅(使用以下命令),整个加载将需要大约 10 秒。
TypedQuery<Dwelling> dwellingQuery = entitymanager.createQuery("select d from Dwelling d", Dwelling.class);
List<Dwelling> dwellings = dwellingQuery.getResultList();
如果我启用两个 table 之间的关联(包含约 800.000 行的家庭),加载将花费很长时间(我在约 10 分钟后中断了它)。
我在 Households.dwellingId 列上建立了索引。
还有什么我可以尝试加快关联查找的速度?
我正在使用 JPA/EclipseLink 2.5.2 从 SQLite 数据库加载两个数据库 table。有两个 table:一个名为 Dwellings,具有 PK dwellingId 和一些其他字段,一个名为 Households,具有 PK householdId、FK dwelllingId 和一些其他字段。
持久性 类 看起来像这样:
@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 行的 table 住宅(使用以下命令),整个加载将需要大约 10 秒。
TypedQuery<Dwelling> dwellingQuery = entitymanager.createQuery("select d from Dwelling d", Dwelling.class);
List<Dwelling> dwellings = dwellingQuery.getResultList();
如果我启用两个 table 之间的关联(包含约 800.000 行的家庭),加载将花费很长时间(我在约 10 分钟后中断了它)。
我在 Households.dwellingId 列上建立了索引。
还有什么我可以尝试加快关联查找的速度?