使用ExecutorService来并行执行4个db2 fetch方法,这是正确的方法吗?

db2dz4w8  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(127)

因此,我有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方法多一点。
有没有人能帮我理解为什么会这样?任何提示/指点都不胜感激。

qco9c6ql

qco9c6ql1#

有没有人能帮我理解为什么会这样?任何提示/指点都很感激。谢谢
您的代码看起来是正确的,所以我怀疑db2对象中的某些内容正在序列化数据库操作,或者服务器无法更快地同时执行4个查询。
更具体地说,db2对象可能只有一个数据库连接,它可能会在fetch调用中锁定连接,因此即使有多个线程调用fetch...(),实际上一次只有其中一个线程在工作。
就数据库而言,每个fetch...操作都可能会导致对大型表进行某种表扫描。同时运行多个fetch...操作并不一定会加快读取速度,甚至可能会导致底层存储机制运行速度变慢,因为在并发操作期间,它必须从4个不同的位置进行阅读。

相关问题