因此,我有4个从DB2中获取数据的java方法,我已经注解沿着从DB2中获取结果所需的相应时间:
db2.fetchCigarProducts(id) // time taken 625 ms
db2.fetchPowderProdcuts(id) // time taken 327 ms
db2.fetchLegacyCigars(id) // time taken 314 ms
db2.fetchDairyProduct(id) // time taken 443 ms
显然,所花费的时间将根据作为输入(参数)给定的id而变化,但这是大多数调用的平均时间。
这是代码的结构化方式,即调用函数的伪代码:
第一个
现在,在上述正常流程中(没有任何多线程),每个itemId的fetchAndProcessDataFromDB 2的时间大约为1500 ms ~= 1.5秒。
因此,为了并行处理这4个方法以保存时间,我使这4个方法同步,并尝试以以下方式使用exectorService:
public void fetchAndProcessDataFromDB2(itemId) {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(
() -> { db2.fetchCigarProducts(id); }
);
executorService.execute(
() -> { db2.fetchPowderProdcuts(id); }
);
executorService.execute(
() -> { db2.fetchLegacyCigars(id); }
);
executorService.execute(
() -> { db2.fetchDairyProduct(id); }
);
executorService.shutdown();
executorService.awaitTermination(5, TimeUnit.SECONDS);
}
我原以为上面的4个方法会并行执行,并且预计总共大约需要400-500毫秒的时间。但令我惊讶的是,使用executorService的fetchAndProcessDataFromDB 2所花费的总时间大约为1.7秒,比不使用多线程的fetchAndProcessDataFromDB 2方法多一点。
有没有人能帮我理解为什么会这样?任何提示/指点都不胜感激。
1条答案
按热度按时间qco9c6ql1#
有没有人能帮我理解为什么会这样?任何提示/指点都很感激。谢谢
您的代码看起来是正确的,所以我怀疑
db2
对象中的某些内容正在序列化数据库操作,或者服务器无法更快地同时执行4个查询。更具体地说,
db2
对象可能只有一个数据库连接,它可能会在fetch调用中锁定连接,因此即使有多个线程调用fetch...()
,实际上一次只有其中一个线程在工作。就数据库而言,每个
fetch...
操作都可能会导致对大型表进行某种表扫描。同时运行多个fetch...
操作并不一定会加快读取速度,甚至可能会导致底层存储机制运行速度变慢,因为在并发操作期间,它必须从4个不同的位置进行阅读。