Java 用OPENJPA加载巨树

Java 用OPENJPA加载巨树,java,jsp,jpa,db2,openjpa,Java,Jsp,Jpa,Db2,Openjpa,我必须用JPA加载一棵树(文件夹和文件)。但是有1000多个节点,加载整个树需要14秒 Categorie.java: public class Categorie implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int idcategorie; @ManyToOne(

我必须用JPA加载一棵树(文件夹和文件)。但是有1000多个节点,加载整个树需要14秒

Categorie.java:

public class Categorie implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idcategorie;
@ManyToOne()
@JoinColumn(name = "IDCATPARENT")
private Categorie categorieParent;

@OneToMany(mappedBy = "categorieParent", cascade = ALL)
private List<Categorie> listeCategorie = new ArrayList<Categorie>();

@OneToMany(mappedBy = "categorieParent", cascade = ALL)
private List<Fichier> listeFichier = new ArrayList<Fichier>();
数据存储在DB2中,我用于加载树:

SELECT c FROM Categorie c LEFT JOIN FETCH c.listeCategorie
SELECT c FROM Categorie c LEFT JOIN FETCH c.listeFichier
我怎样才能更快地加载它

谢谢,对不起,我的英语

编辑: 由OpenJPA生成的查询

SELECT t0, t1, t2 FROM SCHEMA.Categorie t0 LEFT OUTER JOIN SCHEMA.Categorie t1 ON t0.IDCATPARENT = t1.idcategorie LEFT OUTER JOIN SCHEMA.Categorie t2 ON t0.idcategorie = t2.IDCATPARENT WHERE (t0.supprimer = CAST(? AS BIGINT)) ORDER BY t2.IDCATPARENT ASC 
openjpa.jdbc.SQL - <t 1860790064, conn 339897564> [56 ms] spent

SELECT t0, t1, t2 FROM SCHEMA.Categorie t0 LEFT OUTER JOIN SCHEMA.Categorie t1 ON t0.IDCATPARENT = t1.idcategorie LEFT OUTER JOIN SCHEMA.Fichier t2 ON t0.idcategorie = t2.IDCATEGORIE WHERE (t0.supprimer = CAST(? AS BIGINT)) ORDER BY t2.IDCATEGORIE ASC  
openjpa.jdbc.SQL - <t 1860790064, conn -1256330574> [210 ms] spent
从架构中选择t0、t1、t2。将t0分类为左外部联接架构。将t0.IDCATPARENT上的t1分类为t1.IDCATPARENT左外部联接架构。将t0.IDCATPARENT上的t2分类为t2.IDCATPARENT,其中(t0.Supplier=CAST(?AS BIGINT))按t2.IDCATPARENT ASC排序
openjpa.jdbc.SQL-[56毫秒]花费
从架构中选择t0、t1、t2。分类t0左外部联接架构。分类t1在t0.IDCATPARENT=t1.IDCATEGRIE左外部联接架构上。Fichier t2在t0.IDCATEGRIE=t2.IDCATEGRIME其中(t0.Supplier=CAST(?AS BIGINT))按t2.IDCATEGRIE ASC排序
openjpa.jdbc.SQL-[210毫秒]花费

因此,调用数据库非常快,但之后,需要10-15秒才能获得结果作为列表…

您是否尝试过延迟加载集合?例如,将连接注释修改为
@OneToMany(fetch=FetchType.LAZY,mappedBy=“categorieParent”,cascade=ALL)
。另外,为什么需要加载所有节点?默认情况下,OnetoMany的fetchtype是惰性的,我已经尝试切换此模式,但结果大致相同。我必须提供一个管理接口来管理树,并且必须将所有节点导出到jSon。所以我必须加载所有树:(我首先启用openjpasql日志记录(OpenJPA.Log=SQL=trace)来查看是否有任何东西跳出你的视线
SELECT t0, t1, t2 FROM SCHEMA.Categorie t0 LEFT OUTER JOIN SCHEMA.Categorie t1 ON t0.IDCATPARENT = t1.idcategorie LEFT OUTER JOIN SCHEMA.Categorie t2 ON t0.idcategorie = t2.IDCATPARENT WHERE (t0.supprimer = CAST(? AS BIGINT)) ORDER BY t2.IDCATPARENT ASC 
openjpa.jdbc.SQL - <t 1860790064, conn 339897564> [56 ms] spent

SELECT t0, t1, t2 FROM SCHEMA.Categorie t0 LEFT OUTER JOIN SCHEMA.Categorie t1 ON t0.IDCATPARENT = t1.idcategorie LEFT OUTER JOIN SCHEMA.Fichier t2 ON t0.idcategorie = t2.IDCATEGORIE WHERE (t0.supprimer = CAST(? AS BIGINT)) ORDER BY t2.IDCATEGORIE ASC  
openjpa.jdbc.SQL - <t 1860790064, conn -1256330574> [210 ms] spent