Không có gì "thích hợp" để làm điều này, đây không phải là những gì JPA hoặc JDO hoặc bất kỳ ORM nào khác dự định làm, JDBC thẳng sẽ là sự thay thế tốt nhất của bạn, vì bạn có thể định cấu hình nó để khôi phục một số lượng nhỏ hàng tại một thời gian và xóa chúng khi chúng được sử dụng, đó là lý do tại sao con trỏ phía máy chủ tồn tại.
Các công cụ ORM không được thiết kế để xử lý hàng loạt, chúng được thiết kế để cho phép bạn thao tác các đối tượng và cố gắng làm cho RDBMS mà dữ liệu được lưu trữ trong suốt nhất có thể, hầu hết đều không thành công ở phần trong suốt ít nhất ở một mức độ nào đó. Ở quy mô này, không có cách nào để xử lý hàng trăm nghìn hàng (Đối tượng), ít hơn nhiều hàng triệu với bất kỳ ORM nào và để nó thực thi trong bất kỳ khoảng thời gian hợp lý nào vì chi phí khởi tạo đối tượng, đơn giản và đơn giản.
Sử dụng công cụ thích hợp. JDBC thẳng và Thủ tục lưu trữ chắc chắn có một vị trí trong năm 2011, đặc biệt là ở những gì họ làm tốt hơn so với các khuôn khổ ORM này.
Rút một triệu bất cứ thứ gì, thậm chí thành một thứ đơn giản List<Integer>
sẽ không hiệu quả cho dù bạn thực hiện nó như thế nào. Cách chính xác để thực hiện những gì bạn đang yêu cầu là đơn giản SELECT id FROM table
, được đặt thành SERVER SIDE
(phụ thuộc vào nhà cung cấp) và con trỏ đến FORWARD_ONLY READ-ONLY
và lặp lại điều đó.
Nếu bạn thực sự đang kéo hàng triệu id để xử lý bằng cách gọi một số máy chủ web với mỗi id, bạn sẽ phải thực hiện một số xử lý đồng thời để điều này chạy trong bất kỳ khoảng thời gian hợp lý nào. Kéo bằng con trỏ JDBC và đặt một vài trong số chúng cùng một lúc trong ConcurrentLinkedQueue và có một nhóm nhỏ các luồng (# CPU / Cores + 1) kéo và xử lý chúng là cách duy nhất để hoàn thành tác vụ của bạn trên một máy với bất kỳ " bình thường "dung lượng RAM, vì bạn đã hết bộ nhớ.
Xem câu trả lời này là tốt.