Nie ma „właściwego” tego, co należy zrobić, nie to jest przeznaczone do JPA, JDO lub innego ORM-u. Prosty JDBC będzie najlepszą alternatywą, ponieważ można go skonfigurować tak, aby przywrócić niewielką liczbę wierszy w czas i opróżnij je, gdy są używane, dlatego istnieją kursory po stronie serwera.
Narzędzia ORM nie są przeznaczone do przetwarzania zbiorczego, są zaprojektowane tak, aby umożliwić manipulowanie obiektami i próbować uczynić RDBMS, w którym przechowywane są dane, możliwie jak najbardziej przejrzystym, a większość z nich przynajmniej do pewnego stopnia zawodzi w części przezroczystej. W tej skali nie ma sposobu na przetworzenie setek tysięcy wierszy (obiektów), a tym bardziej milionów za pomocą dowolnego ORM i wykonanie go w rozsądnym czasie ze względu na obciążenie związane z tworzeniem obiektów, proste i proste.
Użyj odpowiedniego narzędzia. Prosty JDBC i procedury składowane zdecydowanie mają swoje miejsce w 2011 roku, zwłaszcza w tym, co robią lepiej niż te ramy ORM.
Wyciągnięcie miliona czegokolwiek, nawet do prostego, List<Integer>
nie będzie zbyt wydajne, niezależnie od tego, jak to zrobisz. Prawidłowy sposób na zrobienie tego, o co prosisz, to proste SELECT id FROM table
ustawienie SERVER SIDE
(zależne od dostawcy) i kursor naFORWARD_ONLY READ-ONLY
i iteracja po tym.
Jeśli naprawdę pobierasz miliony identyfikatorów do przetworzenia, wywołując z każdym serwerem WWW, będziesz musiał również wykonać równoległe przetwarzanie, aby to działało w rozsądnym czasie. Przeciąganie za pomocą kursora JDBC i umieszczanie kilku z nich naraz w ConcurrentLinkedQueue oraz posiadanie małej puli wątków (liczba procesorów / rdzeni + 1) ściąganie i przetwarzanie ich to jedyny sposób na wykonanie zadania na maszynie z dowolnym " normalna ilość pamięci RAM, biorąc pod uwagę, że już zaczyna brakować pamięci.
Zobacz również tę odpowiedź .