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 forupdate

我能够使用纯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;

}

以上是 Spring JDBC'选择更新' 的全部内容, 来源链接: utcz.com/qa/403012.html

回到顶部