首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ParallelStream中配置线程

在ParallelStream中配置线程
EN

Stack Overflow用户
提问于 2018-05-03 03:35:29
回答 1查看 894关注 0票数 1

我有下面的代码

代码语言:javascript
复制
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实现每个线程?

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

EN

回答 1

Stack Overflow用户

发布于 2018-05-03 08:34:47

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

代码语言:javascript
复制
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 (如描述的这里 ),每个线程将在本地线程中打开连接。然后关闭线程池,连接就会像描述的这里那样关闭。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50146546

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档