我试图找出我在设置只读副本时看到的问题。我有一个简单的应用程序,它将查询只读副本,我可以通过运行@@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
}
我错过了什么?还是我的测试不正确?