在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 的连接字符串?