使用 Spring 4.3.0 JDBC 模板插入或更新逻辑的总记录的 5% 的高处理时间

High processing times for 5% of the total records using Spring 4.3.0 JDBC template to insert or update logic

Spring 应用程序每分钟从 kafka 主题读取大约 200 个事件,并在两列的组合上使用 where 子句更新单个 table。在复合键上设置适当的索引。

记录upsert的处理时间几乎不变(<30ms)。但在某些时间,单个插入或更新语句的处理时间甚至达到30秒。这些高处理时间和峰值加载时间也没有相关性。

到目前为止,我们已经检查了 CPU 利用率、内存、线程计数和行锁等待时间,因为 well.There 似乎没有问题。请提出任何其他项目来分析此问题。

用于数据库操作的技术堆栈。 Spring 4.3.0 Spring Jdbc 模板。 C3P0 连接池

代码片段

String stmt= //construct query;
jdbcTemplate.update(stmt);
logger.info("Insert event is successful");

示例更新:-

    UPDATE tablename
SET
    column1 = 'string1',
    column2 = 'string2',
    column3 = 0.1,
    column4 = 'string3',
    column5 = 0.1,
    column6 = 'string4',
    column7 = to_timestamp('2020-10-21_08.00.02_861', 'YYYY-MM-DD HH24:MI:SS_FF')
WHERE
    compositeKeyA = 210
    AND compositeKeyB = '123'; 

如果它每次都是 30 秒,那么它看起来像是一个默认值 - 例如等待时间、空闲时间等。您是否尝试过增加池连接数并关闭未使用的连接?

我最终使用动态生成的 Prepared 语句实现了 upsert。

看起来 jdbcTemplate.update(stmt) 为 execution.I 创建了一个语句对象,我猜这是因为没有语句缓存。

当我们开始使用准备好的语句时,它似乎解决了这个问题。

谢谢。