**:
--- 避免出現oom
在處理mysql資料同步到es上時遇到的問題和解決方案:
最初在使用的是jpa資料連線處理,先分頁查詢出資料,然後在轉成es需要的資料格式
這裡用的是最low的json轉換
jsonarray.parsearray(json.tojsonstring(list),object.class)然後在儲存到es中,此處的弊端:
1.讀取mysql的list快取在記憶體中,在通過json轉換,太耗記憶體
2.mysql讀取方式使用limit分頁,查詢效率低下
針對第二點可以優化:(避免使用limit 20000,1000,因為使用limitmysql會掃瞄前20000後開始往後取1000)
如果id的int或long型,且唯一
查詢sql可以通過id排序(這裡使用的是正序),第一次取id>0,其後每次的條件都是id>取出最後乙個物件的id,然後使用limit 0,1000結尾
但是如果使用mysql的jdbc fetch的流資料接收方式,就可以一次查詢億萬條資料,不會在連線上耗費太多時間
preparedstatement preparedstatement =jdbctemplate.getdatasource().getconnection().preparestatement(sql, resultset.type_forward_only, resultset.concur_read_only);//這裡設定成50000是不生效的
preparedstatement.setfetchsize(integer.min_value);
preparedstatement.setfetchdirection(resultset.fetch_reverse);
resultset resultset =preparedstatement.executequery();
list rs = new
arraylist();
while
(resultset.next())
}
最後這個方法就規避了mysql查詢出來資料與es儲存物件轉換的問題
jdbctemplate.query(connection ->,resultset->}
});
mysql將查詢結果儲存到檔案
1.新建查詢語句檔案query.sql,內容如下 set names utf8 select feedid,city message from feed limit 1000 上面的set names utf8語句是設施當前使用的編碼,如果編碼和資料庫的編碼不一致,會出現亂碼 2.執行如下 root...
將MySQL中sql執行結果儲存到檔案
有兩種方法。方法一 在mysql 提示符中使用tee mysql tee output.txt logging to file output.txt mysql notee outfile disabled.或者mysql t output.txt logging to file output.tx...
把mysql查詢結果儲存到檔案的shell指令碼
該指令碼是先刪除已經存在的檔案,然後後台執行sql語句將其執行結果以一定的格式寫入檔案 複製 如下 程式設計客棧 bin bas程式設計客棧h if f www.cppcns.comvar lib mysql hell.txt then rm f var lib mysql hell.txt ech...