質問: 動作環境 ``` org.postgresql:postgresql:9.3-1102-jdbc41 org.mybatis:mybatis:3.2.7 ``` RedShiftに接続してデータ取得をしています ``` SELECT * FROM sample_table WHERE (xxx BETWEEN #{item.From} AND #{item.To}) ``` mybatisに設定するパラメータのlistのサイズが3000以上くらいのときエラーを吐いて、抽出に失敗します。サイズが少ないと条件通り抽出できます。 ``` 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 ``` クエリが長すぎることのIOエラーのような感じですが、なにかいい方法はありますか?
回答: postgresqlの設定にある max_stack_depth の値を増やすことで一応は対応できます。(デフォルト値は2,048kB) ただし超絶巨大なIN句を使ったクエリはパフォーマンス面も悪く、あまりに長大なSQLになるとJava側(Mybatis)がOutOfMemory Errorの可能性も出てきますので、オススメはしません。 抽出条件の見直しをするか、複数回のクエリに分割してJava側で結果を結合するのが良いかと思います。