

動作環境

[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エラーのような感じですが、なにかいい方法はありますか？


CC BY-SA 3.0
2015-11-09T02:57:40.040
18556
2020-04-07T05:38:02.990
2020-04-07T05:38:02.990
19110
13145
question
java sql amazon-redshift
パラメータが多い時のみMyBatisがエラーを出す


listが3000くらいだと...SQL自体の長さ制限とかSQLパーサの限界に引っかかったりしませんかね？  
そこで生成されるSQLを、そのままpgadminで実行したらどうなりますか？

以下のページを見てみるとNOTを1万くらいつないだSQLを実行すると怒られてるみたいですし、mybatisの限界というよりもPostgresの限界って可能性は無いかな～？  
<http://postgresql.g.hatena.ne.jp/umitanuki/20090220/1235094391>


CC BY-SA 3.0
2015-11-09T09:15:19.917
18569
2015-11-09T09:15:19.917
2383
18556
answer


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

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

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


CC BY-SA 3.0
2015-11-09T09:42:44.897
18573
2015-11-09T09:42:44.897
5778
18556
answer