在Java中以编程方式创建一个sql序列[关闭]

Posted

技术标签:

【中文标题】在Java中以编程方式创建一个sql序列[关闭]【英文标题】:Create a sql sequence programmatically in Java [closed] 【发布时间】:2016-10-21 04:13:58 【问题描述】:

我需要从 Java 以编程方式在 sql server 中创建一个 sql 序列,并且我应该能够从序列中检索连续值以进行编程。首先我可以这样做吗?如果有怎么办?

【问题讨论】:

【参考方案1】:

这是可能的,因为所有 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();

简而言之:代码完全避免了事务。一开始它尝试根据标识符检索序列值。如果没有找到它,它会尝试创建它并再次尝试检索。如果在此期间创建了值,它不会失败。

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

【讨论】:

以上是关于在Java中以编程方式创建一个sql序列[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Entity Framework 6 中以编程方式创建与 MS SQL 的连接字符串?

在 liferay 中以编程方式创建站点(组)

如何在 Java 中以编程方式启动和停止 Amazon EC2 实例

在android中以编程方式关闭shift键

如何在ios中以编程方式关闭非页内广告

应用程序运行时如何在android中以编程方式关闭通知?