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