パラメータが多い時のみMyBatisがエラーを出す


動作環境

[code]

    org.postgresql:postgresql:9.3-1102-jdbc41
    org.mybatis:mybatis:3.2.7
    
[/code]

RedShiftに接続してデータ取得をしています

[code]

    SELECT * FROM sample_table WHERE
     <foreach item="item" collection="lists" open="(" close=")" separator=" OR ">
            (xxx BETWEEN #{item.From} AND #{item.To})
     </foreach>
    
[/code]

mybatisに設定するパラメータのlistのサイズが3000以上くらいのときエラーを吐いて、抽出に失敗します。サイズが少ないと条件通り抽出できます。

[code]

    2015-11-07 12:46:26,672 [main] ERROR Main - org.apache.ibatis.exceptions.PersistenceException:
    ### Error querying database.  Cause: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
    ### The error may exist in com/xxx/sql/sql_redshift.xml
    ### The error may involve com.xxx.sql.findXXXs-Inline
    ### The error occurred while setting parameters
    
[/code]

クエリが長すぎることのIOエラーのような感じですが、なにかいい方法はありますか？




postgresqlの設定にある max_stack_depth の値を増やすことで一応は対応できます。(デフォルト値は2,048kB)

ただし超絶巨大なIN句を使ったクエリはパフォーマンス面も悪く、あまりに長大なSQLになるとJava側(Mybatis)がOutOfMemory
Errorの可能性も出てきますので、オススメはしません。

抽出条件の見直しをするか、複数回のクエリに分割してJava側で結果を結合するのが良いかと思います。

