gpt4 book ai didi

mysql - 在 MySQL 中批量更新临时表的插入速度不一致(使用 jdbcTemplate.batchUpdate)

转载 作者:行者123 更新时间:2023-11-29 03:26:54 52 4
gpt4 key购买 nike

我有 MariaDb 实例和一个临时表。工作流程:

  1. 开始交易
  2. 如果存在则删除临时表,创建临时表
  3. 使用 insert into TEMP1 (xxx,yyy) values(?,?),(?,?),(?,?),(?,?)...向其插入 40K 条记录
  4. 以某种方式处理这些数据
  5. 结束交易

Worflow 在一个线程中执行。问题定义:此工作流的第一次运行在 1-3 秒内插入 40K 条记录,所有连续运行在 30-40 秒内插入 40K 条记录。

任何人都可以告诉如何让它在所有运行中运行 1-3 秒吗?

表定义:

CREATE TEMPORARY TABLE IF NOT EXISTS TEMP1 (
uuid varchar(80) COLLATE utf8_unicode_ci NOT NULL,
raw_content longtext COLLATE utf8_unicode_ci NOT NULL,
security_level varchar(255) COLLATE utf8_unicode_ci NOT NULL,
key_name varchar(255) COLLATE utf8_unicode_ci NOT NULL,
stage_user_uuid varchar(80) NOT NULL,
data_type varchar(255) COLLATE utf8_unicode_ci NOT NULL,
string_value varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
integer_value bigint(20) DEFAULT NULL,
double_value double DEFAULT NULL,
date_value datetime DEFAULT NULL,
INDEX user_uuid_idx (stage_user_uuid)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

最佳答案

问题是我使用了 jdbcTemplate.batchUpdate,它以一种非常奇怪的方式工作。我设置了 rewriteBatchedStatements=true

第一次运行真的执行了这样的语句

insert into TEMP1 (xxx,yyy) values(?,?),(?,?),(?,?),(?,?);

Next statements 一个未知原因执行语句

insert into TEMP1 (xxx,yyy) values(?,?);
insert into TEMP1 (xxx,yyy) values(?,?);
insert into TEMP1 (xxx,yyy) values(?,?);

导致缓慢的原因。

可以在带有连接字符串后缀的日志中看到实际语句:&logger=com.mysql.jdbc.log.Slf4JLogger&profileSQL=true

我最终得到了常规的准备好的语句批处理,并且效果很好。

ps.addBatch()
ps.executeBatch()
ps.clearBatch()

根本问题是 jdbcTemplate.batchUpdate 使用 JdbcUtils.supportsBatchUpdates 由于某种原因失败了。我使用 org.apache.tomcat:tomcat-jdbc:8.0.30

driver 'supportsBatchUpdates' method threw exception
java.sql.SQLException: PooledConnection has already been closed.
at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:87)
at com.sun.proxy.$Proxy37.getMetaData(Unknown Source)
at org.springframework.jdbc.support.JdbcUtils.supportsBatchUpdates(JdbcUtils.java:359)
at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:897)
at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:890)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:589)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:617)
at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:890)

关于mysql - 在 MySQL 中批量更新临时表的插入速度不一致(使用 jdbcTemplate.batchUpdate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34788859/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com