Message: Prepared statement contains too many placeholders MySQL的prepared statement只能支持至多65535個占位變量,但原因不詳。
具體到當前項目組遇到的問題,我們在使用MySQL JDBC驅動時,為了提升數據插入的效率,啟用了rewriteBatchedStatements特性,在批量插入數據時,
MySQL的JDBC驅動會將單條的插入語句合並為一條多值的插入語句;而我們導入的數據規模,一條記錄有60列,當導入數據時為1000條記錄時,
SQL中占位符的數目恰好小於65535;當導入2000條記錄時,SQL中點位符的數目已超過65535,語句執行時必然報錯。
了解了引發問題的原因,修復的方法就明確了,將待入庫的數據按照1000拆分為多批,在多個事務中完成插入操作,規避MySQL對占位符的限制。
這個解決方法不完美,破壞了預期的數據事務性,但暫時沒有想到更好的方法。
使用jdbc進行Mysql批量入庫時,PreparedStatment.executeBatch()可能會報錯:prepared statement contains too many placeholders,提示占位符過多。
原因是批量入庫時,rewriteBatchedStatements為true,其作用是將多條sql語句重寫為一條,所以會將一個批次的sql重寫為一條,而mysql預編譯語句時,一條語句占位符最多為65535。當每批次數據量較大時就會超過這個數量。
解決的方法有兩個:一個是減少每批次的數量,但是這樣就達不到批量的效果了。第二個辦法就是將useServerPrepStmts設置為false,即不啟用mysql的預編譯功能。這樣jdbc會進行預編譯,然后將編譯好的sql發送到mysql。就不會有這個問題了。
