gpt4 book ai didi

java - 在 ParallelStream 中配置线程

转载 作者:太空宇宙 更新时间:2023-11-04 10:29:45 26 4
gpt4 key购买 nike

我有以下代码

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. 提交并关闭连接

如果我创建并启动一个线程,我可以做到这一点,我们如何使用并行流在每个线程中实现这一点?

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

最佳答案

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

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?

另一个选项是提供自定义ThreadLocal,如here所述。每个线程都会在线程本地打开连接。然后关闭线程池,连接将被关闭,如here所述。

关于java - 在 ParallelStream 中配置线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50146546/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com