2017-08-03 44 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 

    } 
} 
相关问题