【问题标题】:Thread Pool and Connection Pool , need help to understand how they work Java线程池和连接池,需要帮助来理解它们是如何工作的 Java
【发布时间】:2020-07-10 09:21:46
【问题描述】:

所以基本上我是一家大公司的实习生。我必须做一个小的java程序(javaFX),它需要一个csv列表并更新我们的数据库(3个服务器6个数据库)。该文件有超过 700.000 个条目,我们的服务器可以支持 50 个连接。所以我对连接池的限制是 50,我应该使用不超过 200 个线程。那是我从首席程序员那里得到的信息。

我开始了我的项目,制作了我的对象并从 csv 文件中制作了一个可观察的列表(可以说它只有 Id 和 price,其他字段无论如何都无关紧要)。我所在的堆栈是线程池和连接池。我如何与两者一起工作?在我的新手头脑中,我在想我将创建一个循环,使 200 个线程执行语句,但是我必须使用 50 个连接,所以我应该创建 50 个线程,从池中打开 50 个连接并执行更新?如果有人有一个例子让我了解 mysql 连接的线程是如何工作的,我会非常高兴,因为我的脑袋要爆炸了。

【问题讨论】:

  • 每个线程应该使用一个连接。因此,如果连接数的限制是 50,这意味着您不能使用超过 50 个线程......与数据库通信。请注意,尝试在多个线程之间共享 JDBC Connection 对象是不安全的。 JDBC 对象(ConnectionStatementResultSet 等)(通常)不是线程安全的。
  • 还不清楚尝试运行大量并行线程是否是个好主意。更好的选择可能是将多个更新组合到单个 UPDATE 语句中使用批处理。 (我有点惊讶首席程序员建议你“全力以赴”并行化......)
  • “获取一个 csv 列表”是在内存中还是在磁盘上?
  • 您是否使用单个输入文件来更新三个不同的数据库?
  • 是的,它是一个文件来更新 3 个不同服务器中的 6 个数据库。

标签: java multithreading javafx threadpool connection-pooling


【解决方案1】:

我不明白是否需要使用多线程来读取 CSV 文件 (IO) 并将数据加载到数据库。没有它你也可以做到。 在 Spring 中(假设 JavaFX 支持 Spring)您可以将 Chunks 中的数据作为字节流读取,并将数据分批加载到数据库中(例如每 5000 行)。下面是一个示例 sn-p。

import org.springframework.data.repository.CrudRepository;

//import org.springframework.data.jpa.repository.JpaRepository;
//import org.springframework.data.repository.CrudRepository;

import com.billing.portal.notification.entities.Notification;

public interface NotifyRepo extends CrudRepository<Notification, Integer> {

}

下面的实现代码

@Autowired
NotifyRepo notify;

int total=notifyRecords.size();
System.out.println("Total records are  "+total);
int limit=5000;
int start=0;
int rem=0;
boolean check=true;
if(total>5000) {
    rem = total-limit;
    while(check) {
            System.out.println("Start ::: "+start
                    +" limit ::: "+limit
                    +" rem ::: "+rem
                     );
            notifyRecords1 = notifyRecords.subList(start,limit);
            System.out.println("********************* Batch Insert Started from "+start+" to "+limit +"************************");
            notify.saveAll(notifyRecords1);
            System.out.println("Batch Insert Completed");
            if(limit==total) {
                break;
            }
            start=limit;
            rem=rem-5000;
            limit+=5000;    
            if(rem<=0) {
                limit=total;
            }

        }

    Batchload load = new Batchload();
    loadRepo.save(load);                    

    }else {

        System.out.println("Batch insert started, total less than "+limit);
        notify.saveAll(notifyRecords);
}

【讨论】:

  • 他没有对我说清楚,所以我猜他希望程序尽可能快地更新 3 个不同服务器中的 6 个数据库。所以将线程分布在 3 个服务器和 6 个数据库之间。我正在尝试按照您的建议使用批处理。每 5000 行将执行一次。
  • 他没有对我说清楚,所以我的猜测是作为实习生要学习的就是问、问、问、问你的领导(和同事) 而要忘记的是猜测:)
猜你喜欢
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多