我必须处理近4万条记录,并将它们传递给我的webservice来推送数据,在不使用多线程的情况下,它工作得很好,但却花费了太多的时间,这是不可接受的。我试图在这里应用多线程,但问题是我可以在日志中看到多个线程在处理结果集的同一条记录(即使我是在做完结果集.next后再传递)。
我是Java多线程的新手,希望得到任何帮助。
这是线程创建和作业分配的部分。
ExecutorService exservice =Executors.newFixedThreadPool(3);
while(rs.next()){
exservice.execute(new EmployeeThread(rs,userservice,logger));
}
exservice.shutdown();
你正在调用 rs.next
另外,你在工作线程之外对结果集进行迭代,所以它们都只处理一条记录?
你应该这样做。
将选择语句执行到 RowSet
不像 ResultSet
, RowSet
可以从SQL连接中断开,允许你自由地对该集合进行多次迭代。RowSet
也是可序列化的,允许它在网络上传递。
对于每个工作线程,你可以确定它的工作 "碎片":如果你有1000条记录要处理,有3个工作线程,那么线程#1将处理0-333条记录,线程#2将处理334-666条记录,以此类推。
通过 RowSet
每一个线程都会迭代和跳过,直到开始索引,并处理其shard的记录。
为了让你入门,这里是官方教程,关于 RowSet
来自Oracle文档。https:/docs.oracle.comjavasetutorialjdbcbasicsrowset.html。