1

我试图找出我在设置只读副本时看到的问题。我有一个简单的应用程序,它将查询只读副本,我可以通过运行@@servername 来验证它是否命中了正确的副本。一切都按计划进行。我可以毫无问题地故障转移到同步服务器,并且我的测试应用程序仍然从副本读取。

我遇到的问题是,当我重新启动只读副本时,应用程序永远不会返回到只读副本。即使只读副本重新联机,它也会转到路由中设置的任何内容。来自不同服务器的新连接将命中只读副本。如果我尝试使用不同的方法连接到正在运行测试的服务器上的 AG,它将连接到只读副本。下面的 powershell 脚本将继续访问不同的服务器。

如果我停止应用程序,等待大约 10 或 15 分钟然后启动应用程序,然后我将点击只读副本。如果我将连接字符串设置为使用 pooling=false。然后,一旦副本准备好接受连接,它就会按照预期的方式运行副本。

这就是我用来测试只读副本场景的方法。

function Get-Readonly-Server
{
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Server=AG_OLTP_Listnr.myenv.local;Database=AGTest;Integrated Security=True;applicationintent=readonly"
    $SqlConnection.Open()
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = "select @@servername as colName into #tmp; select colName from #tmp; drop table #tmp"
    $SqlCmd.Connection = $SqlConnection
    $servername = $SqlCmd.ExecuteScalar()
    $SqlConnection.Close()
    $servername
}

for ($i=1; $i -le 1000000; $i++) 
    {
        Get-Readonly-Server
        write-host $i
        Start-Sleep -s 1
    }

我错过了什么?还是我的测试不正确?

4

0 回答 0