2008-11-16 46 views
6

Tôi có một số lượng lớn các hàng trong cơ sở dữ liệu mà từ đó tôi cần tạo một tài liệu XML. Tôi đang sử dụng hibernate 3. Phương thức list() cơ bản trong các giao diện tiêu chí và truy vấn có vẻ nguy hiểm: tôi bỏ nó khá nhiều để đọc tất cả các bản ghi vào bộ nhớ ngay cả khi tôi chỉ lặp lại chúng. Hoặc là có một số phép thuật lười biếng tải? Nếu không, tôi dường như có hai lựa chọn trái: sử dụng scroll() hoặc iterate() từ Query (cuộn cũng có mặt trong Criteria). iterate không nhìn tất cả những gì tuyệt vời, hoặc nếu tôi muốn có tối thiểu SQL roundtrips: "Truy vấn SQL đầu tiên trả về chỉ định danh". Vì vậy, tôi phải, tôi có phải sử dụng scroll() cho điều này?Hibernate: Tránh đọc tất cả các bản ghi vào bộ nhớ cùng một lúc

+0

Công cụ này cũng áp dụng cho NHibernate :) –

Trả lời

1

Sử dụng phương thức setMaxResults() trên Tiêu chí.

Criteria crit = sess.createCriteria(Cat.class); 
crit.setMaxResults(maxResults); 
crit.setFirstResult(firstResultIndex); 
List cats = crit.list(); 

http://hibernate.org/hib_docs/v3/reference/en/html/querycriteria.html

http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Criteria.html

+0

Điều tôi muốn làm là có tất cả kết quả trong giao dịch thời trang. Tôi thu thập rằng bạn có nghĩa là tôi nên xây dựng các resultset lớn từ các bộ phận. Tôi có thể sử dụng chúng để "khâu" kết quả lớn, nhất quán của tôi với nhau để tôi thực sự có được ảnh chụp nhanh từ một thời điểm nhất định hay không. – auramo

+0

Tôi không chắc chắn ý của bạn là gì "có tất cả kết quả trong một giao dịch thời trang". –

+0

Điều tôi muốn nói là kết quả của tôi là ảnh chụp nhanh, không có ghi/xóa nào xảy ra ở giữa các ứng dụng khách khác sẽ ảnh hưởng đến điều đó. – auramo

-1

Ngoài ra, có một cái nhìn tại đợt lấy Mục 19.1.4 và 19.1.5 nên làm. http://www.hibernate.org/hib_docs/v3/reference/en-US/html_single/#queryhql-joins-forms

+0

Bạn có biết liệu các truy vấn theo lô đó (ví dụ 10, 10 và 5 con mèo trong ví dụ) có kết thúc tất cả trong danh sách (nếu tôi truy vấn bảng có danh sách() trong bộ nhớ trong khi tôi lặp qua nó không? lô đầu tiên khi tôi tiến hành đợt tiếp theo (ví dụ 10 con mèo tiếp theo sau 10 con mèo đầu tiên). – auramo

0

Đây là những gì tôi đang có kế hoạch thực hiện: Tạo một bảng tạm thời với các ID đối tượng của tất cả các hàng tôi cần phải xuất khẩu:

Insert into BatchTable (ID, Seq) Select (O.ID, Sequence.Next) 
From MyObject O Where ... 

Trong đơn vị nhỏ của khối lượng công việc trong các đối tượng :

Select Min(B.Seq), Max(B.Seq) From BatchTable; 

for (batch = minBatch; batch <= maxBatch; batch += size) { 
beginTransaction(); 
results = query("Select O From MyObject O, BatchTable B 
        Where O.ID = B.ID and (? <= B.Seq AND B.Seq < ?)"); 

exportXML(results); 
for (MyObject O : results) { 
    O.setProcessed(True); 
    O.update(); 
} 
commit(); 
} 
1

Nếu bạn không cần phải đánh dấu các đối tượng tắt như chế biến không, bạn chỉ có thể sử dụng nút cuộn() và đuổi các đối tượng từ phiên như bạn đang thực hiện với họ.

2

Hãy thử sử dụng cuộn() kết hợp với điều này:

http://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/StatelessSession.html

Một API lệnh theo định hướng để thực hiện thao tác hàng loạt chống lại một cơ sở dữ liệu.

Phiên không trạng thái không triển khai bộ nhớ cache cấp đầu tiên hoặc tương tác với bất kỳ bộ nhớ cache cấp thứ hai nào, cũng như thực hiện thao tác ghi đè giao dịch hoặc tự động bẩn, cũng như không thực hiện thao tác. Các bộ sưu tập bị bỏ qua bởi một phiên không trạng thái. Các hoạt động được thực hiện thông qua một phiên bỏ qua không trạng thái của mô hình sự kiện và kẻ đánh chặn của Hibernate. Các phiên không quốc tịch dễ bị ảnh hưởng bởi các hiệu ứng răng cưa dữ liệu, do thiếu bộ nhớ cache cấp một.

Đối với một số loại giao dịch nhất định, phiên không quốc tịch có thể hoạt động nhanh hơn một chút so với phiên trạng thái.

Các vấn đề liên quan