假设在Server上创建了一个序列:
CREATE SEQUENCE dbo.my_seq
START WITH 1
INCREMENT BY 1
NO CYCLE;
GO和下面的Java代码来获取下一个序列值:
Connection conn = ...;
String sql = "SELECT NEXT VALUE FOR my_seq;";
try (Statement statement = conn.createStatement();
ResultSet resultSet = statement.executeQuery(sql)) {
while (resultSet.next()) {
long seq = resultSet.getLong(1);
System.out.println(seq);
}
}为什么在重复执行这段代码时,序列会跳过两次?
2
4
6我尝试过打开和关闭CACHE选项。没有关系。
如果我在Azure Data上多次执行相同的查询,则序列将增加一个。
我正在运行Microsoft 2019 (RTM-CU15) (KB5008996) - 15.0.4198.2 (X64)。我在com.microsoft.sqlserver:mssql-jdbc:10.2.0.jre8和com.microsoft.sqlserver:mssql-jdbc:11.1.1.jre8-preview驱动程序中尝试了相同的代码,并得到了相同的行为。
我分析了Server查询历史,Java代码只进行了一个查询,每次执行都要获取下一个序列值。
发布于 2022-05-13 19:54:02
According to Gary's answer有一个类似的问题,这是使用selectMethod=cursor选项时已知的行为。只要从连接URL中删除这个选项,序列号就不会再跳过了。
如果您必须出于某种原因使用selectMethod=cursor呢?然后尝试sys.sp_sequence_get_range存储过程,如下所示。
Connection conn = ...;
String sequenceName = "my_seq";
try (CallableStatement statement = conn.prepareCall("{call sys.sp_sequence_get_range(?, ?, ?)}")) {
statement.setString("sequence_name", sequenceName);
statement.setLong("range_size", 1);
statement.registerOutParameter("range_first_value", microsoft.sql.Types.SQL_VARIANT);
statement.execute();
long seq = statement.getLong("range_first_value");
System.out.println(seq);
}即使启用了selectMethod=cursor选项,也不会跳过序列号。
https://stackoverflow.com/questions/72176916
复制相似问题