我有以下代码
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)
,一旦完成,线程应该提交并关闭连接。这可能吗?
答案 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