使用 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% 的处理时间很长的主要内容,如果未能解决你的问题,请参考以下文章