เรากำลังใช้แบบสอบถามเกณฑ์ Spring JPA ( javax.persistence.criteria.CriteriaQuery) เพื่อดึงข้อมูลจากฐานข้อมูล เราใช้ javax.persistence.criteria.Predicate เพื่อสร้างภาคแสดง เรามีภาคแสดง 'หรือ' 1,500 รายการในแบบสอบถามเดียว และแต่ละภาคแสดงจะมี 6 ภาคแสดง 'AND'
SELECT (*) FROM TABLE_ABC as T1 WHERE (t1.column1 = 'c11' AND
t1.column2 = 'c12' AND t1.column3 = 'c13' AND t1.column4 = 'c14' AND
t1.column5 = 'c15')
OR
(t1.column1 = 'c21' AND t1.column2 = 'c22'
AND t1.column3 = 'c23' AND t1.column4 = 'c24' AND t1.column5 = 'c25')
OR
(t1.column1 = 'c31' AND t1.column2 = 'c32'
AND t1.column3 = 'c33' AND t1.column4 = 'c34' AND t1.column5 = 'c35').....
ก่อนหน้านี้เราใช้ "org.hibernate.Criteria" และใช้ 'Conjuction' และ 'Disjunction' เพื่อสร้างแบบสอบถามเดียวกัน แนวทางนี้ทำงานได้อย่างมีประสิทธิภาพ เนื่องจาก "org.hibernate.Criteria" ถูกตัดราคาแล้ว เราจึงย้ายไปยังแพ็คเกจ javax-criteriaquery เรากำลังเผชิญกับความเสื่อมถอยครั้งใหญ่ในด้านประสิทธิภาพ การเจาะลึกบันทึกบ่งชี้ว่ามีการใช้เวลามากขึ้นในขั้นตอนนั้น
=> enterityManager.createQuery() ซึ่งดำเนินการดังต่อไปนี้
- เกณฑ์Compiler.compile
- CriteriaQueryImpl$1.buildCompiledQuery
- เกณฑ์คอมไพเลอร์$1$1.ผูก
การดำเนินการเหล่านี้ใช้เวลานานกว่า
มีวิธีแก้ไขใดที่ทำให้การดำเนินการเหล่านี้เร็วขึ้นหรือไม่? 'javax.persistence.criteria.CriteriaQuery' เป็นหนทางข้างหน้าหรือไม่
โปรดช่วยที่นี่!
โปรดดูรหัสด้านล่าง:
@Transactional(propagation = Propagation.REQUIRES_NEW, isolation = Isolation.READ_COMMITTED)
public getData(List<DataDAO> dataReqList) {
{
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<DataReq> criteriaQuery = builder.createQuery(DataReq.class);
Root<DataReq> dataReqRoot = criteriaQuery.from(DataReq.class);
Predicate[] predicateArr = new Predicate[dataReqList.size()];
for (DataDAO dataReq : dataReqList) {
predicateArr[i] = builder.and(
builder.equal(dataReqRoot.get(TEST_S), dataReq.getS()),
builder.equal(dataReqRoot.get(TEST_T2), dataReq.getT2()),
builder.equal(dataReqRoot.get(K1), dataReq.getK1()),
builder.equal(dataReqRoot.get(K2), dataReq.getK2()),
builder.equal(dataReqRoot.get(TEST_P), dataReq.getP()),
builder.equal(dataReqRoot.get(TEST_T1),
dataReq.getT1(),
builder.equal(dataReqRoot.get(TEST_I), dataReq.getI()));
i++;
}
List<Data> dataResultList = getResultList(builder, criteriaQuery, predicateArr);
}
private List<Data> getResultList(CriteriaBuilder builder,
CriteriaQuery<DataReq> criteriaQuery, Predicate[] predicateArr) {
criteriaQuery.where(builder.or(predicateArr));
TypedQuery<DataReq> query = entityManager.createQuery(criteriaQuery);
List<DataReq> dataReqList = null;
try {
dataReqList = query.getResultList();
} catch(Exception e) {
...
}
return convertToData(dataReqList);
}
ข้อความค้นหาเดียวกันกับ "org.hibernate.Criteria" และการใช้ 'Conjuction' และ 'Disjunction' จะทำงานได้อย่างมีประสิทธิภาพมากในหน่วยมิลลิวินาที