연결 복원력을 통해 JDBC 드라이버는 손상된 유휴 연결을 투명하게 복원하고 실패할 경우 초기 연결을 다시 시도할 수 있습니다. 이 문서에서는 이 동작을 제어하는 두 개의 연결 문자열 속성(connectRetryCount 및 connectRetryInterval)과 드라이버가 끊어진 유휴 연결을 감지하는 데 사용하는 keepalive 설정에 대해 설명합니다. 연결 복원력은 SQL Server Microsoft JDBC Driver 10.2.0부터 사용할 수 있습니다. 망가진 유휴 연결을 재연결하려면 SQL Server 2014 이후 버전이나 Azure SQL Database가 필요합니다.
Tip
연결 복원력은 초기 연결 만 다시 시도하고 끊어진 유휴 연결을 자동으로 복원합니다. 실패한 문(예: 교착 상태 희생자 1205 또는 잠금 시간 초과 1222)을 자동으로 다시 시도하거나, 사용자 지정 오류 번호(예: 40197 또는 40613과 같은 Azure SQL의 일시적 오류)를 사용하여 연결 재시도 목록을 확장하려면 구성 가능한 재시도 논리를 사용합니다. CRL은 규칙 기반이며 오류 및 백오프를 선택하면 이 문서의 기능과 함께 작동합니다.
JDBC 드라이버가 다시 시도되는 방법
JDBC 드라이버는 세 가지 독립적인 재시도 메커니즘을 제공합니다. 함께 작동하므로 한 번에 모두 사용할 수 있습니다.
| 메커니즘 | 용도 | 자세히 알아볼 수 있는 위치 |
|---|---|---|
| 유휴 연결 복원력 | 끊어진 유휴 연결(예: 서버 또는 부하 분산 장치에서 닫힌 풀된 연결)을 투명하게 복원합니다. | 끊어진 유휴 연결 검색 (이 문서) |
| 초기 연결 다시 시도 | 기본 제공되는 일시적 오류 목록에 포함된 오류로 인해 초기 연결에 실패한 경우, 고정된 간격으로 다시 시도합니다. | 초기 연결 다시 시도 (이 문서) |
| 구성 가능한 다시 시도 논리(CRL) | 실패한 문 및 사용자 지정 오류 번호에 대한 규칙 기반 재시도 Microsoft JDBC Driver 12.10에 도입되었습니다. | 구성 가능한 다시 시도 논리 |
초기 연결 다시 시도
JDBC 드라이버에는 초기 연결을 다시 시도하기 전에 드라이버가 대기하는 빈도와 시간을 제어하는 두 개의 연결 속성이 포함되어 있습니다. 이러한 속성을 연결 문자열 추가하거나 데이터 원본 속성을 통해 설정합니다.
| 키워드 | 값 | 기본 | 설명 |
|---|---|---|---|
connectRetryCount |
0과 255(포함) 사이의 정수 | 1 | 포기하기 전에 연결을 설정하거나 다시 설정하는 최대 시도 횟수입니다. 기본적으로 드라이버는 한 번의 재시도를 시도합니다. 값이 0이면 재시도를 비활성화합니다. |
connectRetryInterval |
1과 60(포함) 사이의 정수 | 10 | 연결을 다시 시도하는 간격(초)입니다. 드라이버가 끊어진 유휴 연결을 감지할 때 즉시 다시 연결을 시도한 다음 다시 시도하기 전에 몇 초 정도 기다립니다 connectRetryInterval .
connectRetryCount가 0인 경우 이 속성은 무시됩니다. |
드라이버는 첫 번째 재시도를 즉시 수행하고, 이후 각 재시도 전에는 connectRetryInterval초를 기다리므로, connectRetryCount회의 재시도는 약 (connectRetryCount - 1) * connectRetryInterval초에 걸쳐 이루어집니다.
loginTimeout는 전체 시퀀스의 경계를 정합니다. 즉, 경과 시간에 connectRetryInterval을 더한 값이 loginTimeout에 도달하면 드라이버는 재시도를 중단하는데, 이는 loginTimeout 자체에 도달하기 한 간격 전에 발생합니다.
이러한 속성은 임시 연결 오류의 기본 제공 목록만 다시 시도합니다. 다루는 오류의 전체 목록(4060, 40197, 40501, 40613, 49918-49920 등)은 기본 제공 임시 연결 오류 목록을 참조하세요. 이 집합에 사용자 지정 오류 번호를 추가하거나 완전히 바꾸려면 retryConn에서 사용합니다. 실패한 명령문을 다시 시도하려면 같은 문서에서 retryExec을 사용하세요.
Caution
앞에 오는 없이 retryConn을(를) 설정하면, 내장 목록을 확장하는 대신 +. 본인이 직접 언급하지 않은 내재 오류, 예를 들어 40613은 더 이상 재시도되지 않습니다.
속성 설정
connectRetryCount 및 connectRetryInterval를 JDBC URL, Properties 개체 또는 SQLServerDataSource에서 설정합니다.
JDBC URL에서:
jdbc:sqlserver://server;databaseName=db;connectRetryCount=3;connectRetryInterval=10
Properties 개체와 함께. 이 문서의 Java 코드 조각은 간단히 하기 위해 가져오기 및 클래스 래퍼를 생략합니다.
Properties props = new Properties();
props.setProperty("user", "...");
props.setProperty("password", "...");
props.setProperty("connectRetryCount", "3");
props.setProperty("connectRetryInterval", "10");
Connection c = DriverManager.getConnection("jdbc:sqlserver://server;databaseName=db", props);
SQLServerDataSource 사용함:
SQLServerDataSource ds = new SQLServerDataSource();
ds.setServerName("server");
ds.setDatabaseName("db");
ds.setUser("...");
ds.setPassword("...");
ds.setConnectRetryCount(3);
ds.setConnectRetryInterval(10);
자동 일시정지된 서버리스 데이터베이스에 접속하세요
자동 일시 중지가 사용하도록 설정된 Azure SQL Database serverless를 사용하면 데이터베이스는 첫 번째 연결 시도 시 재개됩니다. 이 시도는 재개 실행 중 오류 40613으로 실패합니다. 데이터베이스는 일반적으로 1분 이내에 재개됩니다. 자세한 내용은 자동 일시정지와 자동 재개를 참조하세요.
오류 40613은 내장된 과도 연결 오류 목록에 포함되어 있으므로, 드라이버는 연결을 다시 시도합니다. 이 경우에는 애플리케이션이 별도의 재시도 루프가 필요하지 않습니다. 기본 설정은 재개를 처리하지 않습니다. 1은(는) connectRetryCount이며, 드라이버는 그 한 번의 재시도를 즉시 실행합니다. 두 시도 모두 데이터베이스가 재개 중일 때 발생하므로 애플리케이션이 오류를 인식합니다.
이력서를 작성하려면 세 가지 속성을 함께 설정하세요:
| Property | 중요한 이유 |
|---|---|
connectRetryCount |
재시도 횟수를 정합니다. 기본값보다 1높게 설정하세요. |
connectRetryInterval |
재시도 간격을 두는 것입니다. 첫 번째 재시도는 즉시 이루어지며; 운전자는 이후 재시도 전에 이 정도 시간을 기다립니다. |
loginTimeout |
전체 시퀀스의 경계를 설정합니다. 드라이버는 경과 시간에 connectRetryInterval을 더한 값이 loginTimeout에 도달하면 재시도를 중지합니다. |
다음 값들은 약 1분 동안 반복 시도하며, 이는 일반적인 이력서를 포함합니다:
jdbc:sqlserver://<server>.database.windows.net;databaseName=<database>;encrypt=true;loginTimeout=120;connectRetryCount=5;connectRetryInterval=15
loginTimeout만 단독으로 높여도 도움이 되지 않습니다. 연결 시도는 멈춘 채 대기하는 것이 아니라 40613 오류와 함께 즉시 실패하기 때문입니다.
connectRetryCount만 그 자체로 높여도 도움이 되지 않습니다. 왜냐하면 loginTimeout가 시퀀스를 중간에 끊어 버리기 때문입니다.
유휴 연결 끊김 감지
일반적인 유휴 연결은 연결 풀에 있는 연결입니다. 드라이버는 활동 없이 약 30초 후에 연결 유휴 상태로 간주합니다. 클라이언트와 서버 사이의 서버 또는 네트워크 디바이스는 유휴 연결을 닫을 수 있으므로 드라이버는 다음 쿼리가 실행되기 전에 소켓이 중지된 것을 확인할 수 있는 방법이 필요합니다.
끊어진 유휴 연결을 검색하기 위해 드라이버는 소켓 수준에서 TCP keepalive 패킷을 사용합니다. Java 11 이후 버전의 Linux에서는 드라이버가 30초 간격KeepAliveTime()으로 키팔라이브 패킷을 자동으로 활성화하며, 실패 시 재시도 사이에 1초 지연()이 있습니다.KeepAliveInterval
중요
Windows 및 Java 11 이전 버전에서는 끊어진 유휴 연결 복구를 활용하도록 운영 체제에서 수동으로 keepalives를 구성해야 합니다. keepalive를 구성하는 방법에 대한 내용은 Azure SQL 데이터베이스에 연결을 참조하세요.
제한 사항
다음 조건 중 어느 것이라도 충족되면 드라이버는 끊어진 유휴 연결을 복원할 수 없습니다.
- 완전히 구문 분석되거나 버퍼링되지 않은 개방형 결과 집합이 있습니다.
- 연결에서 데이터베이스를 Azure SQL 전환했습니다.
- 열려 있는 트랜잭션이 있습니다.