Oracle Database JDBC-Treiber, Versionen vor 12:
Der Treiber ordnet die maximale Größe für jede Spalte mal die Abfrage, die Anzahl der Zeilen in dem fetchSize
vor der Ausführung.
Zum Beispiel für eine VARCHAR(4000)
Spalte wird es 8k Bytes mal die fetchSize
zuweisen.
Versionen 12 (und höher):
Es weist etwa 15 Bytes pro Spalte pro Zeile in der fetchSize
vor dem Ausführen der Abfrage. Nach der Ausführung weist der Treiber in Version 12 nur soviel zu, wie zum Speichern der eigentlichen Zeilendaten erforderlich ist.
Als Ergebnis verwenden Treiber der Version 12 in der Regel wesentlich weniger Speicher als die Treiber der früheren Versionen.
Ihr Beispiel:
In Ihrem Beispiel ein VARCHAR(20)
als 40 Bytes, so groß sein, kann ein NUMBER
als 22 Bytes, wie groß sein und ein VARCHAR(100)
so groß wie 100 Byte. Wenn der fetchSize
auf 100 gesetzt ist, würden die älteren Treiber (40 + 22 + 100) * 100 = 16k
zuweisen. Der Treiber der Version 12 würde 3 * 15 * 100 = 4.5k
zuweisen.Es gibt einen zusätzlichen Overhead in beiden Treibern, den ich ignoriere.
[Siehe dieses] (http: //stackoverflow.com/questions/8234087/where-result-set-is-stored-while-working-with-jdbc-and-oracle-driver). Soweit ich weiß, würde der zugewiesene Speicher im Java-Heap niemals die tatsächliche Anzahl der Zeilen überschreiten. [Siehe auch hier] (http://stackoverflow.com/questions/6651250/resultset-memory) –