for循环,大概需要遍历100万的数据,对于每一条数据,需要更新5张表,调用两次API接口,但是在执行过程中,因为数据量太大,所以执行的中间,由于耗时严重,经常会出现链接中断等问题,如果把这种遍历100万数据的逻辑,搞成多线程,应该怎么搞啊?
用執行緒池或分散式去處理,如果某條資料已經被處理,可以在某個地方做個標記,即時寫入;如果失敗的話,從頭再來也可以過濾掉已經完成的資料。
你還可以設定一個超時時間,然後把失敗的記錄單獨保存下來再用一個策略去重試。
聽你語氣如果只是為了單次處理下這100萬的數據,而不是長期使用這個程序,更應該簡單粗暴多開幾個進程,然後往通過命令行往進程裡傳遞幾個參數過去,假設開10個進程那每個進程負責10萬個資料以特定規則區分每個進程負責的資料即可。例如ID區間
把100萬數據分成多份,每個線程處理一份數據,而且插入數據一定要批量插入,數據庫有索引的話最好先關掉,所有數據全部插入後統一做索引,如果是Oracle的話可以用SQL Loader或其他類似的工具直接插入,避免使用Hibernate之類的方式插入。
使用執行緒池,記錄每個執行緒資料的起始點,然後開始讀取數據,更新表建議使用批次更新,api介面使用非同步的方式調用,邊調用邊更新表。如果覺得這種程序比較複雜。就採用api介面呼叫的資料庫的更新表順序執行。
用執行緒池或分散式去處理,如果某條資料已經被處理,可以在某個地方做個標記,即時寫入;如果失敗的話,從頭再來也可以過濾掉已經完成的資料。
你還可以設定一個超時時間,然後把失敗的記錄單獨保存下來再用一個策略去重試。
聽你語氣如果只是為了單次處理下這100萬的數據,而不是長期使用這個程序,更應該簡單粗暴多開幾個進程,然後往通過命令行往進程裡傳遞幾個參數過去,假設開10個進程那每個進程負責10萬個資料以特定規則區分每個進程負責的資料即可。例如ID區間
把100萬數據分成多份,每個線程處理一份數據,而且插入數據一定要批量插入,數據庫有索引的話最好先關掉,所有數據全部插入後統一做索引,如果是Oracle的話可以用SQL Loader或其他類似的工具直接插入,避免使用Hibernate之類的方式插入。
使用執行緒池,記錄每個執行緒資料的起始點,然後開始讀取數據,更新表建議使用批次更新,api介面使用非同步的方式調用,邊調用邊更新表。如果覺得這種程序比較複雜。就採用api介面呼叫的資料庫的更新表順序執行。