我有下面的代码
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));”进行连接?
我想按每个线程做以下操作
如果我正在创建和启动一个线程--我可以这样做--我们如何使用parallelStreams实现每个线程?
简而言之,我希望parallelStream中的线程获得每个线程的连接并执行name->add(name),一旦完成,线程应该提交并关闭连接。这有可能吗?
发布于 2018-05-03 08:34:47
我认为你不应该为此强迫并行流。如果在块中进行批量插入,您将获得最好的性能。尽管如此,如果您仍然想要这样做,您应该有一个连接池,这样每个线程都会得到一个连接,并在完成工作后释放它。添加方法如下所示:
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 (如描述的这里 ),每个线程将在本地线程中打开连接。然后关闭线程池,连接就会像描述的这里那样关闭。
https://stackoverflow.com/questions/50146546
复制相似问题