用Java编程创建一个sql序列

时间:2016-10-21 04:13:59

标签: java sql jdbc

我需要在Java中以编程方式在sql server中创建一个sql序列,我应该能够从序列中检索连续值到程序。首先,我可以这样做吗?如果是这样的话?

1 个答案:

答案 0 :(得分:0)

这是可能的,因为所有SQL服务器都提供了一些功能并保证了ACID规则。即使使用非常简单的旧MySql引擎也无法支持它可以实现的交易。最简单和广泛支持的方法是:

 CREATE TABLE SequenceValue (
     sequenceIdentifier varchar(124) NOT NULL PRIMARY KEY,
     sequenceValue INT NOT NULL;
 );

您需要在该计划中做的只有:

Connection con = dataSource.getConnection();
try {
    con.setAutoCommit(true);
    PreparedStatement st = con.prepareStatement("SELECT sequenceValue  SequenceValue WHERE sequenceIdentifier = ?");
    st.setString(1, sequenceIdentifier);
    SQLException retried = null;
    for (;;) {
        ResultSet rs = st.executeQuery();
        if (!rs.next()) {
            if (retried != null)
                throw retried;
            PreparedStatement ins = con.prepareStatement("INSERT INTO SequenceValue (sequenceIdentifier, sequenceValue) VALUES (?, ?)");
            ins.setString(1, sequenceIdentifier);
            ins.setLong(2, 0);
            try {
                ins.executeUpdate();
            }
            catch (SQLException ex) {
                // store the exception and rethrow if next query retry fails
                retried = ex;
            }
        }
        else {
            long value = rs.getLong(1);
            PreparedStatement upd = con.prepareStatement("UPDATE SequenceValue SET sequenceValue = sequenceValue+1 WHERE sequenceIdentifier = ? AND sequenceValue = ?");
            upd.setString(1, sequenceIdentifier);
            upd.setLong(2, value+1);
            if (upd.executeUpdate() == 1)                
                return value+1;
        }
    }
}
finally {
    con.close();
}

简要说明:代码完全避免了交易。在开始时,它尝试根据标识符检索序列值。如果找不到它,它会尝试创建它并重试再次检索。如果在此期间创建了值,它不会失败。

如果找到该值,它会尝试使用行上的原子更新来增加它。如果成功,则返回递增的值,否则再次重试。