我的应用程序通过Spring Data Jpa在Springboot上运行。
我有一个Dao类,它使用NamedParameterJdbcTemplate使用其主键对行进行更新。
更新语句非常简单。
SqlParameterSource parameters = new MapSqlParameterSource()
.addValue("uid", uid)
.addValue("fileSize", size)
.addValue("frames", frames)
.addValue("id", id);
int count = namedParameterJdbcTemplate.update(UPDATE_SQL, parameters); // count is 1 for missing updates
在大多数情况下,它可以按预期方式完美工作(更新数据库中的行)。
但是,当我的应用程序负担很重时,我注意到一个非常奇怪的行为。这意味着许多线程正在尝试调用此函数。每个线程将处理一个唯一的行,或者换句话说,没有两个线程将尝试更新同一行。
NamedParameterJdbcTemplate#update()似乎缺少对数据库行的更新(该更新不会传播到MySQL数据库)。对于缺少的更新,我可以看到(使用log语句)值已正确传递,并且update()函数返回的“受影响的行数”显示为1。
我没有看到任何错误/异常,没有任何迹象表明数据库更新存在问题。应用程序流程继续正常进行。
我在org.springframework.jdbc上启用了调试功能,我看到的最后一条语句在org.springframework.jdbc.datasource中“从数据源获取恢复的JDBC连接”。
关于我在这里缺少什么或如何调试问题的任何想法?
我对spring.datasource的所有配置都是默认的。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
春季启动版本:2.1.5.RELEASE MySql版本:5.6.44
注意:我正在尝试将代码重构为batchUpdate,以最大程度地减少往返次数并减少获取连接的等待时间,以查看是否有帮助。我想了解问题的根本原因。