2017-08-03 77 views
-4

如何使用多線程從數據庫中讀取數據,我在DB中有16個表,並且我想使用多線程並行讀取這些表中的數據。如何使用java中的多線程從數據庫中讀取數據

+2

讓每個線程打開自己的連接並執行獨立查詢。不過,我懷疑這是否會有很大幫助。性能很可能受I/O限制,所以您不應該期望它的N線程速度提高N倍。 – Jesper

+0

這個問題是**的方式**廣泛。整本書都是關於這些主題的。做一些*真實*研究,歡迎您回來*真實*特定的問題。 – GhostCat

回答

0

你有幾個選擇。

  1. 在每個線程中創建一個新的連接。
  2. 根據需要創建連接池並從線程獲取連接。
  3. 創建單個連接並在線程中使用之前創建一個synchronize。這不允許您「並行」讀取數據庫,但它允許您跨線程使用相同的連接。
0

創建一個分區器,它將您的所有數據集劃分爲單個線程處理的子組數。

創建單個任務並通過executorservice執行。

使用countdownlatch停止主線程,直到完成所有任務。

使用與threadpool大小相當的連接池。

public class Partitioner { 

    @Override 
    public Map<String, SomeDomainObject> partition(int size) { 

     Map<String, SomeDomainObject> result 
         = new HashMap<String, SomeDomainObject>(); 

     int range = 10;//calculate your range depending on threadsize. 
     int fromId = 1; 
     int toId = range; 

     for (int i = 1; i <= size; i++) { 
      SomeDomainObject value = new SomeDomainObject(); 
      value.setFromId(fromId); 
      value.setToId(toId); 
      value.setThreadName("Thread" + i); 
      result.put("partition" + i, value); 
      fromId = toId + 1; 
      toId += range; 

     } 

     return result; 
    } 
0

這是創建我們如何使用2個線程和2個表格的例子。像明智一樣,您可以將其用於多個表格。

只需要一個連接就可以了,因爲我們只是從表中讀取表而不更新,插入或從表中刪除。

public class ClearPoppup implements Runnable { 

    Connection c; 

    private static final String DB_DRIVER = "com.mysql.jdbc.Driver"; 
    private static final String DB_CONNECTION = "jdbc:mysql://localhost:3306/project"; 
    private static final String DB_USER = "root"; 
    private static final String DB_PASSWORD = "****"; 

    public ClearPoppup() { 

     try { 
      Class.forName(DB_DRIVER); 
      c = DriverManager.getConnection(DB_CONNECTION, DB_USER, DB_PASSWORD); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     ClearPoppup impClass = new ClearPoppup(); 

     Thread t1 = new Thread(impClass) { 
      public void run() { 

       Statement s; 
       try { 
        s = impClass.c.createStatement(); 
        ResultSet rs = s.executeQuery("select * from user"); 
        while (rs.next()) 
         System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3)); 
       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

      } 
     }; 

     Thread t2 = new Thread() { 
      public void run() { 
       Statement s; 
       try { 
        s = impClass.c.createStatement(); 
        ResultSet rs = s.executeQuery("select * from userprofile"); 
        while (rs.next()) 
         System.out.println(rs.getInt(1) + " " + rs.getString(2) + " " + rs.getString(3)); 

       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

     }; 

     t1.start(); 
     t2.start(); 

    } 

    @Override 
    public void run() { 
     // TODO Auto-generated method stub 

    } 
} 
相關問題