SQL Server всегда включен и пулы соединений
Я пытаюсь выяснить проблему, с которой я сталкиваюсь при настройке реплики только для чтения. У меня есть простое приложение, которое будет запрашивать реплику только для чтения, и я могу проверить, что оно соответствует правильному, запустив @@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
}
Что мне не хватает? Или мой тест неверен?