【发布时间】: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