【问题标题】:jdbcTemplate.update freezesjdbcTemplate.update 冻结
【发布时间】:2018-10-23 17:34:36
【问题描述】:

我正在使用没有“transactionManager”的 Spring JdbcTemplate,因为我主要选择去做。

当我尝试从 JUnit 调用选择查询时,它可以工作,但是当我尝试调用“更新”时,它会冻结测试(没有连接超时,什么都没有,只是在等待)。

我见过没有任何事务管理器的 jdbcTemplates 插入/更新示例,但这可能是这里的问题吗?

  public void insert(String param1, String param2) {

    String sql = "UPDATE MYTABLE SET name = :param1 where first_name = :param2";

    NamedParameterJdbcTemplate npJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
    SqlParameterSource namedParameters = new MapSqlParameterSource().addValue("param1", param1).addValue("param2", param2);

    npJdbcTemplate.update(sql, namedParameters);
  }

【问题讨论】:

  • 桌子有多大?查询是否会导致全表扫描,从而需要很长时间?查询可以由其他工具执行吗?底层数据源是否提供自动提交设置为 true 的连接?
  • 我会尝试使用 JDBC (PreparedStatement.executeUpdate) 进行相同的更新,看看它是否在没有 Spring 的情况下挂起。
  • 同一查询在任何 SQL 客户端中都是即时的。您可能对“自动提交”设置和未发生提交是正确的。假设我的数据源在 autocommit = false,我应该怎么做才能手动提交?
  • 我明白了:如果我的数据源不在“自动提交”中,我需要一个“transactionManager”来手动调用“提交”,对吧?
  • 在这个例子中,他和我一样使用 hikariCP,没有设置自动提交(默认为 false)并且正在更新:mkyong.com/spring-boot/spring-boot-jdbc-mysql-hikaricp-example

标签: java spring spring-jdbc jdbctemplate


【解决方案1】:

这里的问题是我在 SQL 客户端(Oracle SQL 开发人员)的同一行上传递了相同的更新查询,但它没有在这个客户端中提交。

我的 JUnit 已经停止了 12 个小时,在我在 SQL 开发人员中提交查询后,更新发生在 JUnit 中。

它与应用中的事务管理或数据源的自动提交状态无关。

【讨论】:

  • 天啊,我会不止一次地赞成这个。花了 2 个小时搜索未执行某个更新调用的原因,而我的 DataGrip 应用程序中仍有一个未完成的提交。
  • 正是我的情况!谢谢!
  • 被这个问题困扰了一天。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2011-10-24
  • 2015-11-17
相关资源
最近更新 更多