Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
В этой статье обсуждаются проблемы, связанные с использованием драйвера Microsoft JDBC Driver для SQL Server для подключения к Базе данных SQL Azure. Дополнительные сведения о подключении к База данных SQL Azure см. в следующем разделе:
Сведения
Чтобы подключиться к База данных SQL Azure, необходимо подключиться к базе данных master для вызова SQLServerDatabaseMetaData.getCatalogs.
База данных SQL Azure не поддерживает возврат всего набора каталогов из пользовательской базы данных.
SQLServerDatabaseMetaData.getCatalogs использует sys.databases представление для получения каталогов. Чтобы понять поведение SQLServerDatabaseMetaData.getCatalogs на База данных SQL Azure, см. обсуждение разрешений в sys.databases.
Время ожидания входа
Когда вы подключаетесь к базам данных Azure SQL, loginTimeout по умолчанию 30 секунд — разумная отправная точка. Для База данных SQL Azure serverless с включенной функцией автоматической паузы увеличьте это значение так, чтобы его хватило на повторные попытки подключения драйвера, пока база данных возобновляет работу. Дополнительные сведения см. в разделе Подключение к автоматически приостановленной бессерверной базе данных. Чтобы установить loginTimeout, см. Настройка свойств соединения.
Подключения прерваны
Когда вы подключаетесь к База данных SQL Azure, сетевой компонент (например, файрвол) может прервать простоящие соединения после периода неактивности. В этом контексте существует два типа холостых соединений:
В состоянии простоя на уровне TCP, где соединения могут быть разорваны любым из множества сетевых устройств.
Бездействующие с точки зрения шлюза Azure SQL, где могут отправляться TCP-сообщения keepalive (что означает, что соединение не считается бездействующим с точки зрения TCP), но по которым в течение 30 минут не выполнялось активных запросов. В этом случае шлюз определит, что соединение TDS бездействует в течение 30 минут, и прервет его.
Во втором случае, чтобы предотвратить прекращение шлюзом бездействующих подключений, можно сделать следующее:
Для настройки источника данных Azure SQL используйте политику подключенияRedirect.
Поддерживайте соединения активными с помощью минимальной активности. Этот метод не рекомендуется, и его следует использовать только в том случае, если нет других возможных вариантов.
Чтобы устранить первую проблему и избежать закрытия неактивных подключений сетевым компонентом, задайте следующие параметры реестра или их эквиваленты для систем, отличных от Windows, в той операционной системе, где загружается драйвер:
Примечание.
Начиная с версии 10.2 драйвера Microsoft JDBC для SQL Server, драйвер автоматически устанавливает следующие значения поддержания соединения активным в сокетах, которые он создает во время подключений к базе данных, переопределяя заданные по умолчанию значения ОС, определенные в следующей таблице. Этот автоматический процесс настройки выполняется только в версиях Java, поддерживающих параметр сокета keep alive. В Linux и macOS последние обновления Java 8+ поддерживают этот параметр. В Windows последние обновления Java 17+ поддерживают этот параметр.
| Параметр реестра | Рекомендуемое значение |
|---|---|
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveTime | 30 000 |
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveInterval | 1000 |
| HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Сервисы \ Tcpip \ Параметры \ TcpMaxDataRetransmissions | 10 |
Перезагрузите компьютер, чтобы параметры реестра вступили в силу.
Значения KeepAliveTime и KeepAliveInterval задаются в миллисекундах. Применение этих параметров позволяет установить период в 10–40 секунд, по истечении которого бездействующее подключение разрывается. Если после отправки пакета keep-alive ответ не получен, пакет будет отправляться повторно каждую секунду, но не более 10 раз. Если в течение этого времени ответ не получен, сокет на стороне клиента отключается. Вам может потребоваться увеличить значение KeepAliveInterval в соответствии с прерываниями, характерными для вашей среды (например, миграциями виртуальных машин), которые могут привести к тому, что сервер не будет отвечать на запросы дольше 10 секунд.
Примечание.
Параметр TcpMaxDataRetransmissions нельзя задать в Windows Vista, Windows 2008 и более поздних версиях.
Чтобы настроить это в виртуальной машине Azure, создайте задачу запуска для добавления ключей реестра. Например, в файл определения службы добавьте следующую задачу, выполняемую при запуске.
<Startup>
<Task commandLine="AddKeepAlive.cmd" executionContext="elevated" taskType="simple">
</Task>
</Startup>
Затем добавьте в проект файл AddKeepAlive.cmd. Выберите для параметра "Копировать в выходной каталог" значение "Всегда копировать". Следующий скрипт представляет собой пример файла AddKeepAlive.cmd.
if exist keepalive.txt goto done
time /t > keepalive.txt
REM Workaround for JDBC keep alive on Azure SQL
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveTime /t REG_DWORD /d 30000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v KeepAliveInterval /t REG_DWORD /d 1000 >> keepalive.txt
REG ADD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpMaxDataRetransmissions /t REG_DWORD /d 10 >> keepalive.txt
shutdown /r /t 1
:done
Добавьте имя сервера к userId в строке подключения
До версии 4.0 драйвера Microsoft JDBC для SQL Server для подключения к базе данных Azure SQL требовалось добавить имя сервера к UserId в строке подключения. Например, user@servername. Начиная с версии 4.0 драйвера Microsoft JDBC для SQL Server больше не нужно добавлять @servername к UserId в строке подключения.
Для использования шифрования необходимо задать hostNameInCertificate
До версии Microsoft JDBC Driver для SQL Server 7.2 для подключения к База данных SQL Azure нужно указывать hostNameInCertificate, если указано значение encrypt=true (если в строке подключения указано имя сервера shortName.domainName, установите для свойства hostNameInCertificate значение *.domainName.). Это свойство является необязательным, начиная с версии драйвера 7.2.
Например:
jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=<password>;encrypt=true;hostNameInCertificate=*.int.mscds.com;