一括入庫時報エラー:prepared statement contains too many placeholders


最近Mysqlの一括入庫時にPreparedStatmentに実行する.executeBatch()という文で、prepared statement contains too many placeholdersと間違えました.プレースホルダが多すぎることを示しています.しかし、私が入庫した表も40+のフィールドしかないことに気づきました.そうではないでしょう.しかし......
 
一括入庫時、Mysqlはinsert文を次の形式につづります.
insert into tablename(  1,   2,   3, ……,   45) values(:  1, :  2, :  3, ……,  :  45), (:  1, :  2, :  3, ……,  :  45), (:  1, :  2, :  3, ……,  :  45), ……,  (:  1, :  2, :  3, ……,  :  45)

たとえば、私が一括入庫したオブジェクトは3000+レコードで、リストの集合にカプセル化しましたが、集合の各要素には45個のkey(1つのkeyが1つのフィールドに対応しています)があります.sqlが上記のフォーマットに組み込まれると、プレースホルダの個数は3000*45=13500に達し、mysqlのプレースホルダに対する最高制限65535より大きい.
したがって、一括入庫時には、プレースホルダの個数は45ではなく、45とストライプの積であることに注意してください.
 
教訓:Listをバッチ化し、各バッチをそれぞれバッチ化し、各バッチで発生するプレースホルダの個数がmysqlの最高制限65535より小さいことを確保する.
一般的に、このようなエラーは一括入庫時に発生しやすく、大量のデータの場合に発生することが多いので、注意してください.