java中如何使用多线程从数据库中读取数据

java中如何使用多线程从数据库中读取数据,java,multithreading,jdbc,concurrency,Java,Multithreading,Jdbc,Concurrency,如何使用多个线程从数据库中读取数据,我在DB中有16个表,我想使用多个线程并行地从这些表中读取数据。您有几个选项 在每个线程中创建一个新连接 创建连接池并根据需要从线程获取连接 在线程中使用之前,创建单个连接并同步它。这不允许“并行”读取数据库,但允许跨线程使用相同的连接 创建一个分区器,将您的所有数据集划分为若干子组,这些子组将通过单个线程进行处理 创建单个任务并通过executorservice执行 使用countdownlatch停止主线程,直到所有任务完成 使用与threadpool大小

如何使用多个线程从数据库中读取数据,我在DB中有16个表,我想使用多个线程并行地从这些表中读取数据。

您有几个选项

  • 在每个线程中创建一个新连接
  • 创建连接池并根据需要从线程获取连接
  • 在线程中使用之前,创建单个连接并同步它。这不允许“并行”读取数据库,但允许跨线程使用相同的连接

  • 创建一个分区器,将您的所有数据集划分为若干子组,这些子组将通过单个线程进行处理

    创建单个任务并通过executorservice执行

    使用countdownlatch停止主线程,直到所有任务完成

    使用与threadpool大小相当的connectionpool

    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;
        }
    
    公共类分区器{
    @凌驾
    公共地图分区(int大小){
    映射结果
    =新HashMap();
    int range=10;//根据线程大小计算范围。
    int-fromId=1;
    int toId=范围;
    
    对于(int i=1;i这是创建如何使用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
    
        }
    }
    

    让每个线程打开自己的连接并进行独立的查询。但是,我怀疑这是否会有很大帮助。性能很可能受到I/O的限制,所以你不应该期望它在N个线程中运行快N倍。这个问题太广泛了。整本书都是关于这类主题的。做一些真正的研究,欢迎你o带着一个真正具体的问题回来。