一括入庫時報エラー:prepared statement contains too many placeholders
851 ワード
最近Mysqlの一括入庫時にPreparedStatmentに実行する.executeBatch()という文で、prepared statement contains too many placeholdersと間違えました.プレースホルダが多すぎることを示しています.しかし、私が入庫した表も40+のフィールドしかないことに気づきました.そうではないでしょう.しかし......
一括入庫時、Mysqlはinsert文を次の形式につづります.
たとえば、私が一括入庫したオブジェクトは3000+レコードで、リストの集合にカプセル化しましたが、集合の各要素には45個のkey(1つのkeyが1つのフィールドに対応しています)があります.sqlが上記のフォーマットに組み込まれると、プレースホルダの個数は3000*45=13500に達し、mysqlのプレースホルダに対する最高制限65535より大きい.
したがって、一括入庫時には、プレースホルダの個数は45ではなく、45とストライプの積であることに注意してください.
教訓:Listをバッチ化し、各バッチをそれぞれバッチ化し、各バッチで発生するプレースホルダの個数がmysqlの最高制限65535より小さいことを確保する.
一般的に、このようなエラーは一括入庫時に発生しやすく、大量のデータの場合に発生することが多いので、注意してください.
一括入庫時、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より小さいことを確保する.
一般的に、このようなエラーは一括入庫時に発生しやすく、大量のデータの場合に発生することが多いので、注意してください.