2013-04-26 14 views
6

Otrzymałem ten błąd podczas próby wykonania dużego zapytania.Brak pamięci podczas wykonywania dużego zapytania?

java.lang.OutOfMemoryError: Java heap space 

Rozglądałem się i stwierdził, że stosowanie setAutoCommit (fałsz) i setFetchSize metod do mojego przygotowane oświadczenie może pomóc przenoszenia dużego zapytania. Jednak gdy go użyłem, otrzymałem ten błąd.

java.sql.SQLException: Illegal value for setFetchDirection(). 

Jaki jest właściwy i łatwy sposób obsługi dużych zapytań?

Jaki jest właściwy sposób korzystania z setFetchSize?

+0

Byłoby łatwiej doradzić z przykładowego kodu. Najczęstszą odpowiedzią na tego typu rzeczy jest jednak podzielenie zapytania na bardziej zarządzane fragmenty. Czy naprawdę potrzebujesz wszystkich tych danych naraz? –

+0

Ile wierszy otrzymasz podczas uruchamiania tego samego zapytania w 'SQL' Console, spróbuj także zwiększyć' heap_size' dla java – Akash

+0

możliwy duplikat [Streaming dużych zestawów wyników z MySQL] (http://stackoverflow.com/questions/ 2447324/streaming-large-result-sets-with-mysql) – RandomSeed

Odpowiedz

4

Zakładając, że używasz sterownika Connector/J dostarczonej przez MySQL, uważam, że rozwiązanie znajduje się w this manual page (Zawiadomienie parametru 1 Connection::createStatement()):

Jeśli pracujesz z wynikowych, które mają dużą liczbę wierszy lub duże wartości i nie można przydzielić pamięci sterty w JVM dla wymaganej pamięci , można nakazać sterownikowi przesłanie wyników z powrotem do jednego wiersza na raz.

Aby włączyć tę funkcję, należy utworzyć instancję oświadczenie, w następujący sposób:

stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, 
       java.sql.ResultSet.CONCUR_READ_ONLY); 
stmt.setFetchSize(Integer.MIN_VALUE); 
+0

Czy można użyć setFetchSize z przygotowaną instrukcją? –

+0

Ponieważ "public interface PreparedStatement rozszerza Statement", przypuszczam, że tak. Podobnie, rozważyłbym użycie metody 'Connection :: prepareStatement (String sql, int resultSetType, int resultSetConcurrency)' do stworzenia takiej 'PreparedStatement'. – RandomSeed

0

może zrobić leniwe przeszukiwanie pociągnąć za przykład właśnie identyfikatora lub coś wtedy, gdy chcemy używać/wyświetlać dane Czy zapytanie dotyczy tylko jednego identyfikatora?

czy może zamiast go uruchomić w wątku, więc po prostu gaśnie i robi to w tle

Powiązane problemy