2016-11-22 3 views
-1

У меня есть одно требование обновить 300 000 записей, которые доступны в базе данных. Когда я написал автономную программу, потребовалось 25-30 минут, чтобы обновить 5 000 записей. поэтому для завершения всех записей это может занять 30 часов. Тогда я подумал, что напишу многопоточную программу. Я создал 2 потока, после чего начал обновляться, его заняло то же время, что и 30 минут для 5к записей.Где использовать концепцию многопоточности

Насколько я знаю, мы используем поток для параллельного доступа к методу, и в этом случае он не ускорит обновление.

Для приведенного выше сценария, что я должен сделать, чтобы уменьшить время. И что фактическое использование многопоточности

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(); 
    } 
} 
+1

Это действительно зависит от того, что происходит в ваших методах 'run()'. –

+0

Строка; \t \t попробовать { \t \t в то время как ((строка = bf.readLine())! = NULL) { \t \t \t \t \t Строка sifID = getSIFID (линия); // строки означает один идентификатор \t \t \t \t // Я прочитал этот идентификатор из текстового файла, где есть 3 lakhs 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

+0

Не могли бы вы добавить код на свой вопрос? Таким образом, мы можем, например, см. области применения. –

ответ

-1

MultiTherading используется для параллельного доступа, а не для времени и цели производительности. Вы должны попробовать массовое обновление непосредственно обновив несколько подобных записей

+0

Ys Я тоже думаю. Но такая же программа, если я запускаю на 5 разных машинах, тогда записи обновляются быстрее, так как это может быть несколько процессов. то как я буду делать то же самое на одной машине в той же программе. – kunu

+0

, то в этом случае я согласен с ответом bmargulies. Попробуйте подключить каждый поток с независимым подключением к базе данных. –

0

Первого: Используйте пакетное обновление для добавления запросов и нажмите в конце набора, информации here (general) и here (for oracle

Во-вторыхов: Вы повторяете реализацию класса просто для нового файла просто добавьте параметр для класса, который получает путь к файлу.

class MyThrea extends Thread { 
    public static String getTaskID(String PID) { 
     String taskID = OurGenerator.orgPID(PID); 
     return taskID; 
    } 

    Connection con; 
    BufferedReader bf; 

    MyThread1(Connection con, String path) { 
     this.con = con; 
     this.pstmt = pstmt; 
     try { 
      bf = new BufferedReader(new FileReader(path)); 
     } catch (IOException e) { 
      System.out.println("IO Error Occurred: " + e.toString()); 
     } 
    } 

    public void run() { 

     PreparedStatement pstmt = con.prepareStatement("update Taskdata set taskID=? where entryid=?"); 
     String line; 
     try { 
      while ((line = bf.readLine()) != null) { 
       String taskID = getTaskID(line); 
       pstmt.setString(1, taskID); 
       pstmt.setString(2, line); 
       pstmt.addBatch(); 
      } 

      pstmt.executeBatch(); 
     } 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("", "", ""); 
     MyThread first = new MyThread1(con, "path_to_file_1"); 
     first.start(); 
     MyThread second = new MyThread1(con, "path_to_file_2"); 
     second.start(); 
    } 
} 

его можно улучшить, загрузив сначала файл, а затем выполнив обновление.

0

Большая часть работы по обновлению базы данных происходит на сервере. В зависимости от базы данных и конфигурации вашего конкретного сервера это может помочь представить серверу с несколькими потоками работы - или это может повредить, или это может вообще не повлиять на производительность.

В основном, однако, это не поможет, если каждый поток не имеет собственного независимого подключения к базе данных.

Смежные вопросы