Các chức năng mã bên dưới, nhưng Hibernate không bao giờ cho phép việc nắm giữ bất kỳ đối tượng nào. Gọi số session.clear()
sẽ gây ra các ngoại lệ liên quan đến việc tìm nạp một lớp đã tham gia, và gọi session.evict(currentObject)
trước khi truy xuất đối tượng tiếp theo cũng không giải phóng được bộ nhớ. Cuối cùng tôi xả không gian của tôi.Hibernate: Đi bộ hàng triệu hàng và không bị rò rỉ bộ nhớ
Kiểm tra vùng heap của tôi, StatefulPersistenceContext là gốc của trình thu thập rác cho tất cả các tham chiếu trỏ đến đối tượng của tôi.
public class CriteriaReportSource implements JRDataSource {
private ScrollableResults sr;
private Object currentObject;
private Criteria c;
private static final int scrollSize = 10;
private int offset = 1;
public CriteriaReportSource(Criteria c) {
this.c = c;
advanceScroll();
}
private void advanceScroll() {
// ((Session) Main.em.getDelegate()).clear();
this.sr = c.setFirstResult(offset)
.setMaxResults(scrollSize)
.scroll(ScrollMode.FORWARD_ONLY);
offset += scrollSize;
}
public boolean next() {
if (sr.next()) {
currentObject = sr.get(0);
if (sr.isLast()) {
advanceScroll();
}
return true;
}
return false;
}
public Object getFieldValue(JRField jrf) throws JRException {
Object retVal = null;
if(currentObject == null) { return null; }
try {
retVal = PropertyUtils.getProperty(currentObject, jrf.getName());
} catch (Exception ex) {
Logger.getLogger(CriteriaReportSource.class.getName()).log(Level.SEVERE, null, ex);
}
return retVal;
}
}
Tôi đã xem các ví dụ về điều này trong [Tham chiếu Hibernate] (http://docs.jboss.org/hibernate/core/3.3/reference/en/html/batch.html#batch-update), tuy nhiên, ở đó 'session.flush()' được gọi trước 'session.clear()'. Bạn có thể thử liệu nó có tạo nên sự khác biệt không? –
Cơ sở dữ liệu là gì? Không phải tất cả đều hỗ trợ di chuyển con trỏ đúng. Ngoài ra, tôi không thấy bạn đóng ScrollableResults. –
Tôi đã sử dụng MySQL. –