我有一個需求來更新數據庫中可用的300 000條記錄。當我編寫獨立程序時,它花費了25-30分鐘來更新5 000條記錄。所以要完成所有的記錄可能需要30個小時。然後我想我會寫一個多線程程序。我創建了2個線程,然後開始更新,同時花費30分鐘處理5k個記錄。何處使用多線程概念
就我所知,我們使用線程來併發訪問一個方法,並且在這種情況下它不會加速更新。
對於上述情況,我必須做些什麼來減少時間。多線程的實際用途是什麼
class MyThread1 extends Thread{
public static String getTaskID(String PID)
{
String taskID = OurGenerator.orgPID(PID);
return taskID;
}
Connection con;
PreparedStatement pstmt;
BufferedReader bf;
MyThread1(Connection con,PreparedStatement pstmt){
this.con=con;
this.pstmt=pstmt;
try {
bf=new BufferedReader(new FileReader("D:/prod_review_sifid3.txt"));
}catch (IOException e)
{
System.out.println("IO Error Occurred: " + e.toString());
}
}
public void run(){
String line;
try{
while ((line = bf.readLine()) != null)
{
String taskID = getTaskID(line);
pstmt.setString(1,taskID);
pstmt.setString(2,line);
pstmt.executeUpdate();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
class MyThread2 extends Thread{
public static String getTaskID(String PID)
{
String taskID = OurGenerator.orgPID(PID);
return taskID;
}
Connection con;
PreparedStatement pstmt;
BufferedReader bf;
MyThread2(Connection con,PreparedStatement pstmt){
this.con=con;
this.pstmt=pstmt;
try {
bf=new BufferedReader(new FileReader("D:/sifid_review2.txt"));
}catch (IOException e)
{
System.out.println("IO Error Occurred: " + e.toString());
}
}
public void run(){
String line;
try{
while ((line = bf.readLine()) != null)
{
String taskID = getTaskID(line);
pstmt.setString(1,taskID);
pstmt.setString(2,line);
pstmt.executeUpdate();
}
}catch(Exception e){
e.printStackTrace();
}
}
}
public class SifuuidInsert {
public static void main(String ar[])throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection con=DriverManager.getConnection("","","");
PreparedStatement pstmt=con.prepareStatement("update Taskdata set taskID=? where entryid=?");
MyThread1 first=new MyThread1(con,pstmt);
first.start();
MyThread2 second=new MyThread2(con,pstmt);
second.start();
}
}
這真的取決於你的'run()'方法發生了什麼。 –
絃線; \t \t嘗試{ \t \t而((線= bf.readLine())!= NULL) \t { \t \t \t \t字符串sifID = getSIFID(線); //線指一個ID \t \t \t \t //我從一個文本文件中讀取了該ID,其中有3萬個ID存在 \t \t \t \t pstmt.setString(1,sifUUID); \t \t \t \t pstmt.setString(2,line); \t \t \t \t pstmt.executeUpdate(); \t \t \t \t \t } \t \t}趕上(例外五){ \t \t \t e.printStackTrace(); \t \t} – kunu
您能否將代碼添加到您的問題中?這樣我們可以例如見範圍。 –