Azure SQL 데이터베이스에 연결
이 문서에서는 SQL Server용 Microsoft JDBC Driver를 사용하여 Azure SQL Database에 연결하는 경우의 문제에 대해 논의합니다. Azure SQL Database에 연결하는 방법에 대한 자세한 내용은 다음을 참조하세요.
세부 정보
Azure SQL Database에 연결하려면 master 데이터베이스에 연결하여 SQLServerDatabaseMetaData.getCatalogs를 호출해야 합니다.
Azure SQL Database는 사용자 데이터베이스에서 전체 카탈로그 집합을 반환하는 기능을 지원하지 않습니다. SQLServerDatabaseMetaData.getCatalogs는 sys.databases 보기를 사용하여 카탈로그를 가져옵니다. Azure SQL Database에서 SQLServerDatabaseMetaData.getCatalogs 동작을 이해하려면 sys.databases(Transact-SQL)의 권한에 대한 설명을 참조하세요.
로그인 제한 시간
Azure SQL 데이터베이스에 연결할 때 권장되는 기본 loginTimeout
은 30초입니다. 서버리스 인스턴스에 연결하는 경우 60초 이상의 loginTimeout
을 사용하는 것이 좋습니다. 서버리스 인스턴스가 유휴 상태인 경우 초기 연결에서 활성화하는 데 다소 시간이 걸릴 수 있습니다. loginTimeout
설정 방법에 대한 자세한 내용은 연결 속성 설정을 참조하세요.
연결이 삭제됨
Azure SQL Database에 연결할 때 비활성 기간 후 방화벽과 같은 네트워크 구성 요소에서 유휴 연결을 종료할 수 있습니다. 유휴 연결에는
네트워크 디바이스에서 연결을 삭제할 수 있는 TCP 계층에서 유휴 연결(Idle at the TCP layer) 및
TCP keepalive 메시지가 발생할 수 있으나(TCP 쪽에서 유휴 상태가 아닌 연결하기) 30분간 활성 쿼리가 없는 Azure SQL 게이트웨이에서 유휴 연결(Idle by the Azure SQL Gateway)의 두 가지 종류가 있습니다. 이 시나리오에서 게이트웨이가 TDS 연결이 30분간 유휴 상태이고 연결을 종료됨을 결정합니다.
두 번째 문제를 해결하고 게이트웨이에서 유휴 연결을 종료하지 않도록 하려면 다음을 수행할 수 있습니다.
Azure SQL 데이터 원본을 구성하려면 리디렉션 연결 정책을 사용합니다.
경량 작업을 통해 연결을 활성 상태로 유지합니다. 이 방법은 사용하지 않는 것이 좋으며, 다른 가능한 옵션이 없는 경우에만 사용해야 합니다.
첫 번째 문제를 해결하고 네트워크 구성 요소에서 유휴 연결을 삭제하지 않도록 하려면 드라이버가 로드된 운영 체제에서 다음 레지스트리 설정(또는 Windows가 아닌 경우 이에 해당하는 설정)을 설정합니다.
레지스트리 설정 | 권장되는 값 |
---|---|
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveTime | 30000 |
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ KeepAliveInterval | 1000 |
HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ Tcpip \ Parameters \ TcpMaxDataRetransmissions | 10 |
레지스트리 설정을 적용하려면 컴퓨터를 다시 시작합니다.
KeepAliveTime 및 KeepAliveInterval 값은 밀리초 단위입니다. 이러한 설정으로 인해 응답하지 않는 연결이 10~40초 이내에 끊어집니다. 연결 유지 패킷 전송 후 응답이 수신되지 않으면 1초마다 최대 10번까지 다시 시도됩니다. 이 시간 동안 응답이 수신되지 않으면 클라이언트 쪽 소켓의 연결이 끊깁니다. 환경에 따라 서버가 10초 이상 응답하지 않을 수 있는 알려진 중단(예: 가상 머신 마이그레이션)을 수용하기 위해 KeepAliveInterval을 늘릴 수 있습니다.
참고
Windows Vista 또는 Windows 2008 이상에서는 TcpMaxDataRetransmissions를 제어할 수 없습니다.
Azure VM에서 이 작업을 구성하려면 레지스트리 키를 추가하는 시작 작업을 만듭니다. 예를 들어 다음과 같은 시작 태스크를 서비스 정의 파일에 추가합니다.
<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
연결 문자열에서 서버 이름을 사용자 ID에 추가
SQL Server용 Microsoft JDBC Driver의 4.0 버전 이전에는 Azure SQL Database에 연결하기 위해 연결 문자열에서 서버 이름을 사용자 ID에 추가해야 했습니다. 예를 들면 user@servername과 같은 형식입니다. SQL Server용 Microsoft JDBC Driver 4.0 버전부터 연결 문자열에서 @servername을 사용자 ID에 추가할 필요가 없게 되었습니다.
암호화 사용에 hostNameInCertificate 설정 필요
SQL Server용 Microsoft JDBC Driver의 7.2 버전 이전에서는 Azure SQL Database에 연결하기 위해 encrypt=true를 지정하면 hostNameInCertificate를 지정해야 합니다(연결 문자열의 서버 이름이 shortName.domainName인 경우 hostNameInCertificate 속성을 *.domainName으로 설정). 드라이버 버전 7.2부터 이 속성은 선택 사항입니다.
다음은 그 예입니다.
jdbc:sqlserver://abcd.int.mscds.com;databaseName=myDatabase;user=myName;password=myPassword;encrypt=true;hostNameInCertificate=*.int.mscds.com;