Настроить потоки в ParallelStream - PullRequest
0 голосов
/ 03 мая 2018

у меня ниже код

public void addNames(){
   List<String> names = new ArrayList<String>
   names.parallelStream().foreach(name->add(name));
}

private void add(String name){
   SQLSession session = SQLSessionFactory.getSession(config);
   Connection con=Session.openConnection();
   con.insert(name);
   con.commit;
   con.close
}

Проблема в том, что “name->add(name)” будет выполняться для каждого имени, там я открываю и закрываю соединения для каждого имени. Если у меня есть миллионы записей, тогда это проблема.

Я не могу открыть соединение за пределами “names.parallelStream().foreach(name->add(name, connection));” и передать его в качестве параметра, поскольку все потоки будут заблокированы на одном объекте соединения.

Итак, я хочу получить соединение для потока, как я могу сделать это, используя “names.parallelStream().foreach(name->add(name));”?

Я хочу сделать следующее за потоком

  1. Получить соединение
  2. Вставить
  3. Вставить
  4. Вставка —— N вставок
  5. Подтвердить и закрыть соединение

Если я создаю и запускаю поток, я могу сделать это. Как мы можем добиться этого для каждого потока, используя parallelStreams?

Короче говоря, я хочу, чтобы поток в параллельном потоке получал соединение для каждого потока и выполнял name->add(name), а после этого поток должен зафиксировать и закрыть соединение. Это возможно?

1 Ответ

0 голосов
/ 03 мая 2018

Я думаю, вы не должны форсировать параллельный поток для этого. Вы получите лучшие результаты, если будете делать массовые вставки кусками. Тем не менее, если вы все еще хотите это сделать, у вас должен быть пул соединений, чтобы каждый поток получал соединение и сбрасывал его после выполнения своей работы. Ваш метод добавления будет выглядеть так:

private void add(String name){
    Connection con=genCoonection(); //just take a connection from pool
    con.insert(name);
    con.commit;//commit after each record
}

Вы можете найти несколько примеров того, как создать и использовать пул соединений здесь: Как установить пул соединений в JDBC?

Другой вариант - предоставить пользовательский ThreadLocal, как описано здесь , и каждый поток откроет соединение в локальном потоке. Затем вы закрываете пул потоков, и соединение будет закрыто, как описано здесь

...