弁財天

ゴフマン「専門家を信じるのではなく、自分自身で考えて判断せよ」

巨大な表をSELECTするとjava.lang.OutOfMemoryError

巨大な表をSELECTするとPostgreSQLではOutOfMemoryErrorでJavaが落ちてしまう。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.ClassLoader.findLoadedClass0(Native Method)
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:922)
at java.lang.ClassLoader.loadClass(ClassLoader.java:295)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1309)
at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)

 

カーソルを使った照会

Example 5.2. Setting fetch size to turn cursors on and off.
Setting the fetch size back to 0 will cause all rows to be cached (the default behaviour).

デフォルトで Statement#setFetchSize(0) に設定される。
この状態では、すべての検索結果行をキャッシュしてしまい、結果的にヒープ領域がパンクしてしまう。

Porting JDBC applications from Oracle to PostgreSQL by Chris Drawater (2006-03-24) OracleからPostgreSQLへ移行するときの注意点に
JDBC Extensions

Remove any Oracle JDBC extensions, such as

        ((OracleConnection)con2).setDefaultRowPrefetch(50);

 

Instead, the row pre-fetch must be specified at an individual Statement level =>
eg.

        PreparedStatement pi = con1.prepareStatement(“select….”);
pi.setFetchSize(50);

 

If not set, the default fetch size will default to 0;

OracleからPostgreSQLに移行する場合の、定石らしい。

投稿されたコメント:

コメント
コメントは無効になっています。