db mysql / mysql cluster 5.7.19 / useServerPrepStmts / cachePrepStmts


s

https://dev.mysql.com/doc/connectors/en/connector-j-reference-configuration-properties.html

1. 增加批量寫的速度:
useServerPrepStmts=false  
rewriteBatchedStatements=true  
useCompression=true
2. 增加讀的速度:
useServerPrepStmts=true
cachePrepStmts=true

 

 

案例 :JDBC的批量批量插入

https://www.cnblogs.com/DreamDrive/p/5757693.html

MySQL5.7 union all + jdbc預編譯參數useServerPrepStmts=true Bug 踩坑

https://www.jianshu.com/p/6245cd7ee134

通過在MySQL 源碼的git log中搜索內部Bug號#27422376,對比代碼差異,定位到 union all 在遇到DATE類型字段時,返回的是內部使用的NEWDATE類型,導致jdbc接收到這種NEWDATE類型無法識別,報錯。官方在修復這個問題時,通過real_type_to_type 這個函數,將 MYSQL_TYPE_NEWDATE 轉換為 MYSQL_TYPE_DATE。

4. 規避方案
升級MySQL到5.7.22 及以上版本
關閉jdbc預編譯參數useServerPrepStmts=false,可能有性能損耗
修改sql,在外面包裝一層select,如 select * from <your sql>
修改表結構,不使用DATE類型字段

案例:kettle大數據量讀寫mysql性能優化

https://www.cnblogs.com/cl1234/p/9627833.html

修改kettleDB連接設置

 

1. 增加批量寫的速度:
useServerPrepStmts=false  
rewriteBatchedStatements=true  
useCompression=true
2. 增加讀的速度:
useServerPrepStmts=true
cachePrepStmts=true

參數說明:

1)useCompression=true,壓縮數據傳輸,優化客戶端和MySQL服務器之間的通信性能。

2)rewriteBatchedStatements=true  ,開啟批量寫功能

將會使大批量單條插入語句:

INSERT INTO t (c1,c2) VALUES ('One',1);
INSERT INTO t (c1,c2) VALUES ('Two',2);
INSERT INTO t (c1,c2) VALUES ('Three',3);

改寫成真正的批量插入語句:

INSERT INTO t (c1,c2) VALUES ('One',1),('Two',2),('Three',3);

3)useServerPrepStmts=false  關閉服務器端編譯,sql語句在客戶端編譯好再發送給服務器端,發送語句如上。

如果為true,sql會采用占位符方式發送到服務器端,在服務器端再組裝sql語句。

占位符方式:INSERT INTO t (c1,c2) VALUES (?,?),(?,?),(?,?);

此方式就會產生一個問題,當列數*提交記錄數>65535

 

時就會報錯:Prepared statement contains too many placeholders,

這是由於我把“提交記錄數量”設為10000,而要插入記錄的表字段有30個,所以要進行批量插入時需要30*10000=300000  > 65535 ,故而報錯。

解決方案:

方案1:把DB連接中的 rewriteBatchedStatements 給設置為false(或者去掉),不過這個操作會影響數據的插入速度。

方案2:更改表輸出的設計。確保30個輸出字段的和提交記錄數量的乘積不超過65535。比如把提交記錄數量由10000更改為450(30*2000=60000< 65535)

當然我們的目的是為了提高數據庫寫速度,所以當rewriteBatchedStatements =true時useServerPrepStmts=false必須配合使用。

 mysql參數調優可以參考如下文檔

https://dev.mysql.com/doc/connectors/en/connector-j-reference-configuration-properties.html

數據丟失問題

性能提升后,遇到另外個問題,86萬數據丟失了130多條,kettle無報錯,各種mysql參數設置之后都無效果,耗時近一天,最終查到是重復數據導致。

估計是因為重復數據在mysql寫不進去導致該批次數據寫失敗,但是kettle無報錯這個就比較坑。

解決辦法就是:1)取消數據表主鍵或者唯一索引 ,當然這是治標不治本的做法。2)根本的做法就是排查重復數據,從源頭杜絕重復數據

 

end


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM