Spring jdbc 'select for update'

标签 spring spring-boot jdbc spring-jdbc jdbctemplate

我有以下与 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;
}

我找不到如何做 for update 的例子使用 Spring JDBC。我要 in_use设置为 true 用于更新。

我需要使用 select 进行更新,因为此应用程序将以多线程方式使用。我不希望多个线程获得同一行,防止这种情况的方法是使用 select for update
我能够用普通 JDBC 做到这一点,这是我问如何用普通 JDBC 做到这一点的问题

select "for update" with 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 'select for update',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56350833/

相关文章:

java - 如何在参数化查询中使用 spring MVC jdbcTempates 传递字符串以删除多行

mysql - 如何防止 findByName 方法的并发请求?

java - Spring Scheduled Cron 作业在错误的时间触发

java - JDBC + ScriptRunner : error with runScript

java - 当我们有超过 1 个 url 时如何对传入请求进行 xsd 验证

Spring JmsTemplate 和 Apache ActiveMQ,为什么有这么多连接?

java spring boot 在启动之前从数据库获取值

java - 将 JDBC 连接到 Sql Server 2012 时出现 SSLv3 错误?

java - 如何为 Oracle JDBC 瘦驱动程序设置环境变量

java - jackson 反序列化抽象类