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

Posted

技术标签:

【中文标题】使用 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 【发布时间】:2021-02-04 21:03:38 【问题描述】:

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

记录 upsert 的处理时间几乎是恒定的 (

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

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

代码sn-p

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'; 

【问题讨论】:

你能分享更多关于“upsert”的细节吗? SQL 看起来如何——您是否可能更新主键列?表中是否注册了触发器? 嗨 Mick .. 我编辑了主要帖子以添加查询。这是一个动态构造的查询。表上有一个数据库更新查询。但是插入的处理延迟也发生了!在更新语句中,主键没有更新。谢谢。 用这么少的信息真的很难给出建议。您能否从出现缓慢的时间段收集 Oracle 的 Statspack 或 AWR 报告? 你试过换成HikariCP吗?如果你不能/不会,你的数据库配置是什么? 您的问题非常接近“我如何调整 SQL 语句”,这是一个没有单一、简单答案的大话题。首先,您可能希望在视图GV$SQL 中找到SQL_ID,然后从GV$ACTIVE_SESSION_HISTORY 中查找它们占用了多长时间以及它们在等待什么资源。这些问题通常需要大量信息和大量来回,而且通常在 Stack Overflow 上效果不佳。 【参考方案1】:

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

看起来 jdbcTemplate.update(stmt) 为执行创建了一个语句对象。我猜这是由于缺少语句缓存。

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

谢谢。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于使用 Spring 4.3.0 JDBC 模板插入或更新逻辑的总记录的 5% 的处理时间很长的主要内容,如果未能解决你的问题,请参考以下文章

Spring基础4

为啥 Spring 的 JDBC 模板不使用表默认值

Spring03Spring的连接数据库以及JDBC模板

Spring的JDBC模板

Spring JDBC入门

Spring对JDBC的模板支持——JdbcTemplate