使用 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 创建了一个语句对象,我猜这是因为没有语句缓存。
当我们开始使用准备好的语句时,它似乎解决了这个问题。
谢谢。
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 创建了一个语句对象,我猜这是因为没有语句缓存。
当我们开始使用准备好的语句时,它似乎解决了这个问题。
谢谢。