所以基本上我是在一家大公司实习的。我必须做一个小的Java程序(javaFX),它带有一个csv列表并更新我们的数据库(3服务器6数据库)。该文件有700.000个条目,我们的服务器可以支持50个连接。所以我对连接池的限制是50个,我应该使用不超过200个线程。那就是我从首席程序员那里得到的信息。
我开始了我的项目,创建了我的对象,并从csv文件中列出了一个可观察的列表(可以说,其中仅包含ID和价格,无论如何其他字段都不相关)。我在堆栈中的是线程池和连接池。我如何同时使用两者?在我的新手脑海中,我想我将创建一个循环,该循环使200个线程执行该语句,但是随后我必须使用50个连接,因此我应该使50个线程从池中打开50个连接并执行更新?如果有人为我提供一个示例来理解与mysql连接的线程如何工作,我将非常高兴,因为我的头会爆炸。
我不理解需要多线程来读取CSV文件(IO)并将数据加载到数据库。没有它,您就可以实现。在Spring中(假定JavaFX支持Spring),您可以以字节流的形式读取Chunk中的数据,并将数据批量加载到数据库中(例如,每5000行)。以下是示例片段。
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);
}