在ParallelStream中配置线程

时间:2018-05-03 03:35:29

标签: java multithreading parallel-processing java-stream java-threads

我有以下代码

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. 提交并关闭连接
  6. 如果我正在创建并启动一个线程,我可以这样做,我们如何使用parallelStreams实现每个线程?

    简而言之,我希望parallelStream中的线程获得每个线程的连接并执行name->add(name),一旦完成,线程应该提交并关闭连接。这可能吗?

1 个答案:

答案 0 :(得分:0)

我认为你不应该为此强制并行流。如果批量插入块,您将获得最佳性能。然而,如果你仍然想要这样做,你应该有一个连接池,以便每个线程获得一个连接并在完成它的工作后释放它。您的添加方法如下所示:

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

您可以在此处找到有关如何创建和使用连接池的多个示例: How to establish a connection pool in JDBC?

另一种选择是提供here描述的自定义ThreadLocal,每个线程将在本地线程中打开连接。然后关闭线程池,连接将按照here

所述关闭