2009-06-02 15 views
1

Ich verwende JDBC, um eine große Menge an Daten zu erhalten. Der Aufruf erfolgreich abgeschlossen, aber wenn resultSet.next() genannt wird, erhalte ich folgende Fehlermeldung:Nicht genügend Speicher allocLargeObjectOrArray von ResultSet

java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 15414016, Num elements: 7706998 

ich versucht habe die JVM Speichergröße zu erhöhen, aber das Problem nicht beheben. Ich bin mir nicht sicher, ob dieses Problem überhaupt gelöst werden kann, da ich JDBC nicht für den Zugriff auf eine Datenbank verwende, sondern dass das System über JDBC auf einen BEA AquaLogic-Dienst zugreift.

Hat jemand in diesen Fehler geraten?

+0

können Sie einen vollständigeren Stack-Trace buchen? – Gandalf

+0

Was versuchen Sie aus der Datenbank zu lesen? –

Antwort

1

Beachten Sie, dass bis zum ersten resultSet.next() - Aufruf die Ergebnisse möglicherweise noch nicht aus der Datenbank gelesen wurden oder sich irgendwo in einer anderen Caching-Struktur befinden.

Sie sollten versuchen, Ihre Auswahl einzuschränken, um eine vernünftige Menge an Ergebnissen zurückzugeben und den Anruf eventuell zu wiederholen, bis keine weiteren Ergebnisse mehr vorhanden sind, wenn Sie alle Daten benötigen.

Das Erhöhen der JVM-Speichergröße hilft nur, wenn Sie sicher sein können, dass die Datenmenge absolut begrenzt ist, die von Ihrem JDBC-Aufruf zurückgegeben wird.

Außerdem kocht jeden Service über JDBC Zugriff auf im Wesentlichen nach unten zu verwenden JDBC :)

Weitere (unwahrscheinlich) Möglichkeit könnte sein, dass es einen Fehler in den JDBC-Treiber ist Sie verwenden. Versuchen Sie eine andere Implementierung, wenn es möglich ist, und überprüfen Sie, ob das Problem weiterhin besteht.

+0

Ich würde nicht zweifeln, dass der JDBC-Fahrer der Schuldige ist. Ich kann jedoch keine andere Implementierung versuchen, da dies BEA-spezifisch ist. Es gibt andere Wege, die Informationen zu bekommen, nach denen ich suche, aber das wäre zu dieser Zeit ein großer Rückschritt. – Nick

+1

Ich hatte nicht wirklich Zeit, um das Problem herauszufinden. In der Zwischenzeit scheint es mir möglich zu sein, dass die Daten fehlerfrei zurückgegeben werden. Ich glaube, mein Fall war sowieso ein Randfall. Akzeptieren dieser Antwort, weil es die robusteste war. – Nick

0

Sie können versuchen, die Methode setFetchSize (int rows) für Ihre Anweisung zu setzen.
Aber setFetchRows ist nur ein Hinweis, was bedeutet, dass es nicht implementiert werden kann.

+1

Dies funktioniert nicht, da nur eine Zeile zurückgegeben wird. – Nick

0

Versuchen Sie, die Speichergröße auf 1,2 g zu erhöhen, z. -mx1200m oder etwas weniger als der physische Speicher Ihrer Maschine. Vielleicht finden Sie mehr Daten auf einmal als Sie denken.

+1

Ich habe meinen Speicher so weit erhöht, dass die JVM die Anwendung nicht starten würde, weil sie sagte, dass ich zu viel Speicher angegeben habe. Meine Maschine ist auch nicht die Stärkste. – Nick

1

First-- herausfinden, wenn Sie wirklich so viele Daten im Speicher sofort erhalten müssen. RDBMS eignen sich gut zum Sammeln/Sortieren von großen Datenmengen, und Sie sollten versuchen, dies möglichst zu nutzen.

Wenn nicht (und Sie wirklich, wirklich brauchen so viele Daten im Arbeitsspeicher aus irgendeinem Grund) ... und stoßen die JVM Speicherargumente nicht die Messlatte nicht hoch ... schauen Sie in einen In-Speicher verteilte Caching-Lösung wie Coherence (COTS) oder TerraCotta (Open Source).

0

Wie viele Zeilen kehren Sie aus der Datenbank zurück? Wie kosi2801 würde ich vorschlagen, nur eine Teilmenge der Daten zu holen, mit einer vernünftigen Zahl zu beginnen und dann zu erhöhen, um den Schwellenwert zu finden.

Verwandte Themen