Spring NamedParameterJdbcTemplate#update有时在多线程环境中不会更新

时间:2019-08-25 04:08:47

标签: spring spring-boot spring-data-jpa spring-data spring-jdbc

我的应用程序通过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,以最大程度地减少往返次数并减少获取连接的等待时间,以查看是否有帮助。我想了解问题的根本原因。

0 个答案:

没有答案