Các đúng nơi để nhìn vào trong tài liệu cho loại điều trị này là toàn bộ Chapter 13. Batch processing.
Ở đây, có một số sai lầm rõ ràng trong cách tiếp cận hiện tại của bạn:
- bạn không nên bắt đầu/cam kết giao dịch cho mỗi lần cập nhật.
bạn nên cho phép JDBC trạm trộn và đặt nó vào một số lượng hợp lý (10-50):
hibernate.jdbc.batch_size 20
bạn nên flush()
và sau đó clear()
phiên đều đặn (mỗi n hồ sơ trong đó n là bằng tham số hibernate.jdbc.batch_size
) hoặc nó sẽ tiếp tục phát triển và có thể phát nổ (với OutOfMemoryException
) tại một số điểm.
Dưới đây, ví dụ đưa ra trong phần 13.2. Batch updates minh họa này:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
ScrollableResults customers = session.getNamedQuery("GetCustomers")
.setCacheMode(CacheMode.IGNORE)
.scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while (customers.next()) {
Customer customer = (Customer) customers.get(0);
customer.updateStuff(...);
if (++count % 20 == 0) {
//flush a batch of updates and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
Bạn cũng có thể xem xét sử dụng StatelessSession.
Một tùy chọn khác sẽ là sử dụng DML-style operations (trong HQL!): UPDATE FROM? EntityName (WHERE where_conditions)?
.Đây ví dụ CẬP NHẬT HQL:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName";
// or String hqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery(hqlUpdate)
.setString("newName", newName)
.setString("oldName", oldName)
.executeUpdate();
tx.commit();
session.close();
Một lần nữa, hãy tham khảo tài liệu hướng dẫn cho các chi tiết (đặc biệt là làm thế nào để đối phó với các version
hay timestamp
giá trị tài sản bằng cách sử dụng từ khóa VERSIONED
).
Nguồn
2010-03-07 22:53:08
Bạn có thực sự muốn nói * N * Hibernate (trong tiêu đề) không? – M4N
Không dành cho Java - NHibernate dành cho .NET. – duffymo
cố định nhờ tiêu đề. – Blankman