某天,在群里看見(jiàn)有個(gè)人 問(wèn) sqlService里面有2000萬(wàn)條數(shù)據(jù) 需要轉(zhuǎn)儲(chǔ)到orcale中。什么方式比較好,后來(lái)一琢磨非多線程莫屬啊~;
我這里沒(méi)有那么多數(shù)據(jù),所以我就模擬了下 一次存入10萬(wàn)條數(shù)據(jù),看有多快~;上代碼。
在數(shù)據(jù)庫(kù)創(chuàng)建 表 t_test 2個(gè)字段 id name
定義一個(gè)類(lèi) 繼承Runnable 實(shí)現(xiàn)run方法
public class Test implements Runnable{
//實(shí)現(xiàn)run方法
public void run() {
//定義一個(gè)集合~這個(gè)集合是用來(lái)裝入存入失敗的數(shù)據(jù)
List<Integer> list = new ArrayList<Integer>();
//這里就是要設(shè)置存入的數(shù)據(jù) 200個(gè)
for (int i = 0; i < 200; i++) {
String sql="INSERT into t_test VALUES(null,"+i+")";
try {
//jdbc方式存入,這個(gè)是自己寫(xiě)的工具類(lèi)
JDBCUtils.executeSQL(sql);
} catch (Exception e) {
//當(dāng)出現(xiàn)錯(cuò)誤的時(shí)候 會(huì)把沒(méi)有存入的裝入集合里面
list.add(i);
}
}
//判斷集合是否為空,不為空證明有數(shù)據(jù)沒(méi)有存入,利用遞歸的方式在進(jìn)行存入
if(!list.isEmpty()){
System.out. dg(list);
}
}
//需要進(jìn)行遞歸的操作
public void dg(List<Integer> list){
ArrayList<Integer> list2 = new ArrayList<Integer>();
for (Integer i : list) {
String sql="INSERT into t_test VALUES(null,"+i+")";
try {
JDBCUtils.executeSQL(sql);
} catch (Exception e) {
list2.add(i);
}
}
if(!list2.isEmpty()){
System.out.println("進(jìn)行遞歸");
dg(list2);
}else{
System.out.println("結(jié)束");
}
}
public static void main(String[] args) {
Thread thread = null;
//開(kāi)啟500跳線程
for (int i = 0; i < 500; i++) {
//需要開(kāi)啟線程的類(lèi)
thread = new Thread(new Test());
//開(kāi)啟現(xiàn)成
thread.start();
}
}
}
這只是一個(gè)思路~轉(zhuǎn)儲(chǔ)數(shù)據(jù)庫(kù)的話(huà)其實(shí)和這個(gè)差不多;
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注