Edited at

jOOQが巨大なリザルトセットをフェッチするとOOMエラーが出る場合にデフォルトフェッチサイズを設定する方法

jOOQが巨大なリザルトセットをストリーム的にフェッチするようにしたにもかかわらず、OutOfMemoryErrorとかになっちゃう場合は、おそらくフェッチサイズが無限の状態(PostgreSQLドライバの場合)になっているので、以下のXMLファイルをクラスパスのルート直下において、 jOOQのフェッチサイズのデフォルト設定値として使われるようにしましょう。

(詳しい処理はorg.jooq.conf.SettingsTools参照)


src/main/resources/jooq-settings.xml

<?xml version="1.0" ?>

<settings
xmlns="http://www.jooq.org/xsd/jooq-runtime-3.11.2.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<!-- 適当なサイズを指定してください。 -->
<fetchSize>1000</fetchSize>

</settings>


なお、上記設定にあわせて、上記のXMLをJavaBeansにアンマーシャルするために、下記の依存性が別途必要になります。追加しましょう。


build.gradle

    // 場合によりバージョン指定など異なると思うので適当な値を探してください。

runtime('javax.activation:activation:1.1.1')
runtime("com.sun.xml.bind:jaxb-impl:...")
runtime("com.sun.xml.bind:jaxb-core:...")



SpringBootでも同じ

SpringBootで spring-boot-starter-jooq を使っていたとしても、上記と同じ設定を application.properties などで実施する方法はなさそうなので、あきらめてXMLファイルを置くなりしましょう。


ほかの方法(PostgreSQLの場合)

同僚の人に教えてもらいました。

PostgreSQLのJDBC URLに下記文字列をつければ良いようです。

&defaultRowFetchSize=1000