Пул потоков и пул соединений, нужна помощь, чтобы понять, как они работают Java - PullRequest
0 голосов
/ 30 марта 2020

Так что в основном я стажер в большой компании. Я должен сделать небольшую java программу (javaFX), которая принимает список csv и обновляет наши базы данных (3 сервера 6 баз данных). Файл содержит более 700 000 записей, и наш сервер может поддерживать 50 соединений. Таким образом, мое ограничение на пул соединений составляет 50, и я должен работать не более чем с 200 потоками. Вот информация, которую я получил от ведущего программиста.

Я запустил свой проект, сделал свой объект и сделал наблюдаемый список из файла CSV (допустим, в нем есть только Id и цена, другие поля все равно не имеют значения). Где я стек, это пулы потоков и пулов соединений. Как я могу работать с обоими? В моей голове newb ie я думал, что сделаю al oop, который создает 200 потоков, которые выполняют операторы, но затем мне нужно использовать 50 соединений, поэтому я должен создать 50 потоков, которые открывают 50 соединений из пула и выполняют обновления ? Если у кого-нибудь есть пример для меня, чтобы понять, как работают потоки с mysql соединениями, я был бы очень рад, так как моя голова взорвется.

1 Ответ

1 голос
/ 30 марта 2020

Я не понимаю необходимости go для многопоточности для чтения файла CSV (IO) и загрузки данных в базу данных. Вы можете достичь этого без этого. Весной (при условии, что JavaFX поддерживает Spring) Вы можете считывать данные в чанках как поток данных и загружать данные в базу данных партиями (скажем, например, каждые 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);
}
...