我有一个Web应用程序,必须将请求发送到数据库以从中检索数据。令人讨厌的是,这个数据库不允许它发送整个数据库(我无法控制的遗留设计)所以我必须发送所有条目的请求......我能够实现通过使用并行流并在并行流中生成线程的解决方案。通过这样做,我能够将时间从5分钟缩短到1分钟。但是,我还没有将它部署到实际的Tomcat服务器,在此之前我想确认我的解决方案是否会导致我读过的任何线程安全问题;大多数都在7年或8年前讨论过....
这是我正在做的事情的示例模板:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
...
...
Set<String> otherSet = new HashSet<String>();
Set<String> set = Collections.synchronizedSet(new HashSet<String>());
try {
otherSet.parallelStream().forEach(e -> {
// Sends a request to retrieve from one table from
Thread t1 = new Thread(
new Runnable1(String x, String y, Set<String> set) {
// send a request to database and store in "set"
});
// Sends a request to retrieve from another table from the database
Thread t2 = new Thread(
new Runnable2(String z, String k, Set<String> set) {
// send a request to database and store in "set"
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
} catch (Exception e) { }
...
response.write(toJSONFormat(set));
}
另外,您对使用的想法是什么:
System.setProperty(&#34; java.util.concurrent.ForkJoinPool.common.parallelism&#34;,&#34; XX&#34;);
我可以通过将XX设置为10来将时间再减少10秒。而且我不确定服务器运行的硬件规格,它可能有更多的线程......