簡體   English   中英

使用SqlCommand.ExecuteScalar()從序列中選擇高磁盤使用時返回NULL

[英]Select from sequence with SqlCommand.ExecuteScalar() returns NULL when high disk usage

我遇到SqlCommand.ExecuteScalar()有時在生產環境中返回NULL

我在這里遇到了很多類似的問題,最接近的是: SqlCommand.ExecuteScalar返回null但原始SQL沒有 但給出的建議與我的情況無關。

代碼示例如下:

using (var connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "SELECT NEXT VALUE FOR Seq_Revision";
        command.CommandType = CommandType.Text;

        return (long)command.ExecuteScalar(); //<---ExecuteScalar() here returns NULL sometimes
    }
}

Seq_Revision這里是簡單的MSSQL序列,如下所示:

CREATE SEQUENCE [dbo].[Seq_Revision] 
 AS [bigint]
 START WITH 0
 INCREMENT BY 1
 MINVALUE -9223372036854775808
 MAXVALUE 9223372036854775807
 CACHE  10 
GO

而且我很確定它永遠不會實際返回NULL。


我也觀察到類似的怪(不可重復的行為)時, NULL此代碼示例中返回,而我敢肯定這個ID的實體:

NHibernate.ISession.Get<FooEntity>(entityId)

有趣的是,通過此方法返回NULL與SQL節點上磁盤活動較多( 磁盤隊列長度> ~50)時的時間幀相關。

可能很重要:我們使用具有2個節點的AlwaysON集群,其中一個節點用於讀取模式( ApplicationIntent=READONLY在連接字符串中)。

MSSQL版本是:

Microsoft SQL Server 2014 (SP2-CU5) (KB4013098) - 12.0.5546.0 (X64) 
    Apr  3 2017 14:55:37 
    Copyright (c) Microsoft Corporation
    Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: )

我認為問題可能與序列緩存有關。

也許有一些未處理的東西會導致緩存中剩余的序列號丟失。

嘗試在序列中禁用緩存:

ALTER SEQUENCE [dbo].[Seq_Revision] 
 NO CACHE
GO

或者嘗試使用更高的緩存值:

ALTER SEQUENCE [dbo].[Seq_Revision] 
 CACHE 100
GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM