首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么从Java代码中获取SQL Server序列时会跳过两次?

为什么从Java代码中获取SQL Server序列时会跳过两次?
EN

Stack Overflow用户
提问于 2022-05-09 18:52:58
回答 1查看 148关注 0票数 4

假设在Server上创建了一个序列:

代码语言:javascript
复制
CREATE SEQUENCE dbo.my_seq
    START WITH 1
    INCREMENT BY 1
    NO CYCLE;
GO

和下面的Java代码来获取下一个序列值:

代码语言:javascript
复制
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);
    }
}

为什么在重复执行这段代码时,序列会跳过两次?

代码语言:javascript
复制
2
4
6

我尝试过打开和关闭CACHE选项。没有关系。

如果我在Azure Data上多次执行相同的查询,则序列将增加一个。

我正在运行Microsoft 2019 (RTM-CU15) (KB5008996) - 15.0.4198.2 (X64)。我在com.microsoft.sqlserver:mssql-jdbc:10.2.0.jre8com.microsoft.sqlserver:mssql-jdbc:11.1.1.jre8-preview驱动程序中尝试了相同的代码,并得到了相同的行为。

我分析了Server查询历史,Java代码只进行了一个查询,每次执行都要获取下一个序列值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-13 19:54:02

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

如果您必须出于某种原因使用selectMethod=cursor呢?然后尝试sys.sp_sequence_get_range存储过程,如下所示。

代码语言:javascript
复制
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选项,也不会跳过序列号。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72176916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档