假设在SQL 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 Studio上多次执行同一查询,则序列将递增1.

我正在运行Microsoft SQL Server 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个司机try 了同样的代码,得到了同样的行为.

我分析了SQL Server查询历史记录,Java代码只进行了一次查询,每次执行时获取下一个序列值.

推荐答案

According to Gary's answer对于类似的问题,这是使用selectMethod=cursor选项时的已知行为.只要从连接URL中删除这个选项,序列号就不会再跳过了.

如果你因为某种原因必须使用selectMethod=cursor怎么办?然后try 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选项,它也不会跳过序列号.

Java相关问答推荐

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

Java:根据4象限中添加的行数均匀分布行的公式

SQlite for Android无法使用json_group_array/json_object

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

现场观看Android Studio中的变化

Spring Boot@Cachebale批注未按预期工作

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

使用Spring和ActiveMQ的侦听器方法引发属性名称不能重复为空警告

由于在生成器模式中使用泛型,lambda表达式中的返回类型错误

使用htmlunit和java单击按钮

如何在太阳系模拟器中添加月球?

如何在Java中为thunk创建映射器函数

从映射列表中检索所有键

如何获得凌空cookies ,并设置它在下一个请求- android

AbstractList保证溢出到其他方法

SonarQube在合并升级到java17后对旧代码提出错误

如何使用java区分以下结果

什么是;u〃;平均值;jdku;在java开发工具包中?

JAVA 正则表达式识别字符串string或字符串内的字符char

与配置类中的自动装配字段相反是什么意思?