spring - Spring jdbc'选择更新'
问题描述
我有以下与 Spring JDBC 一起使用的方法
public String getState() {
String stateLink = template.queryForObject(
"select state_url from state_scrape_queue where in_use = false ORDER BY scrape_timestamp NULLS FIRST LIMIT 1",
(result, rowNum) -> {
return result.getString("state_url");
});
return stateLink;
}
我找不到如何使用 Spring JDBC进行更新的示例。我想in_use
使用更新设置为true。
我需要使用 select 进行更新,因为此应用程序将以多线程方式使用。我不希望多个线程获得同一行,防止这种情况的方法是使用select for update
我可以用纯 JDBC 做到这一点,这是我问如何用纯 JDBC 做到这一点的问题
任何人都知道这将如何完成?
解决方案
这是我想出的,请随时推荐改进
public String getState() throws SQLException {
String state = null;
Connection conn = DataSourceUtils.getConnection(template.getDataSource());
try {
conn.setAutoCommit(false);
String[] colNames = { "id", "state_url", "in_use" };
String query = "select " + Stream.of(colNames).collect(Collectors.joining(", "))
+ " from state_scrape_queue where in_use = false ORDER BY scrape_timestamp NULLS FIRST LIMIT 1 FOR UPDATE";
System.out.println(query);
try (Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
ResultSet rs = stmt.executeQuery(query)) {
while (rs.next()) {
// Get the current values, if you need them.
state = rs.getString(colNames[1]);
rs.updateBoolean(colNames[2], true);
rs.updateRow();
conn.commit();
}
}
} catch (SQLException e) {
conn.setAutoCommit(true);
e.printStackTrace();
} finally {
conn.setAutoCommit(true);
}
return state;
}
推荐阅读
- php - Laravel Route Model Binding 在不同模型使用相同结构时发生冲突
- c++ - 我需要 std::conditional 但有两个以上的选择
- php - 如何在 PHP 中使用 WSDL Web 服务?
- vue.js - 在页面/组件加载时打开模式对话框
- css - 如何在 FOLDER 中包含所有全局样式?
- javascript - 为什么 date.getHours()%12 给你 1-12 格式的时间?
- graph - 使用最大标准偏差减少的最小生成树聚类
- python - 从网上下载表格
- python - 如何用列名中的非标准字符替换 PySpark 中所有列的值?
- django - 显示从外键关系到自序列化程序的信息