मेरे पास निम्न विधि है जिसका उपयोग मैं स्प्रिंग जेडीबीसी के साथ करता हूं

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;
}

मुझे अपडेट के लिए। मैं चाहता हूं कि in_use को अपडेट के लिए सही पर सेट किया जाए।

मुझे अपडेट के लिए चयन का उपयोग करने की आवश्यकता है क्योंकि इस एप्लिकेशन का उपयोग बहु-थ्रेडेड फैशन में किया जाएगा। मैं नहीं चाहता कि एक से अधिक धागे एक ही पंक्ति प्राप्त करें और इसे रोकने का तरीका select for update का उपयोग करना है

मैं इसे सादे जेडीबीसी के साथ करने में सक्षम था, यहां सवाल है कि मैंने इसे सादे जेडीबीसी के साथ कैसे किया है

JDBC के साथ "अपडेट के लिए" चुनें?

किसी को पता है कि यह कैसे किया जाएगा?

4
Arya 29 मई 2019, 01:28

1 उत्तर

सबसे बढ़िया उत्तर

मैं यही लेकर आया हूं, बेझिझक सुधार की सिफारिश करें

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;
}
0
Arya 29 मई 2019, 18:17