연결 복원력을 통해 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인 경우 이 속성은 무시됩니다. |
connectRetryCount * connectRetryInterval가 loginTimeout보다 크면 드라이버는 loginTimeout에 도달하면 연결 시도를 중지합니다. 그렇지 않으면 connectRetryCount이 소진될 때까지 계속됩니다.
이러한 속성은 임시 연결 오류의 기본 제공 목록만 다시 시도합니다. 다루는 오류의 전체 목록(4060, 40197, 40501, 40613, 49918-49920 등)은 기본 제공 임시 연결 오류 목록을 참조하세요. 이 집합에 사용자 지정 오류 번호를 추가하거나 완전히 바꾸려면 retryConn에서 사용합니다. 실패한 명령문을 다시 시도하려면 같은 문서에서 retryExec을 사용하세요.
속성 설정
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);
유휴 연결 끊김 감지
일반적인 유휴 연결은 연결 풀에 있는 연결입니다. 드라이버는 활동 없이 약 30초 후에 연결 유휴 상태로 간주합니다. 클라이언트와 서버 사이의 서버 또는 네트워크 디바이스는 유휴 연결을 닫을 수 있으므로 드라이버는 다음 쿼리가 실행되기 전에 소켓이 중지된 것을 확인할 수 있는 방법이 필요합니다.
끊어진 유휴 연결을 검색하기 위해 드라이버는 소켓 수준에서 TCP keepalive 패킷을 사용합니다. Linux 및 Java 11 이상에서는 드라이버가 keepalive 패킷을 30초 간격으로(KeepAliveTime) 자동으로 활성화하며, 실패가 발생하면 재시도 사이에 1초 지연을 둡니다(KeepAliveInterval).
중요
Windows 및 Java 11 이전 버전에서는 끊어진 유휴 연결 복구를 활용하도록 운영 체제에서 수동으로 keepalives를 구성해야 합니다. keepalive를 구성하는 방법에 대한 내용은 Azure SQL 데이터베이스에 연결을 참조하세요.
제한 사항
다음 조건 중 어느 것이라도 충족되면 드라이버는 끊어진 유휴 연결을 복원할 수 없습니다.
- 완전히 구문 분석되거나 버퍼링되지 않은 개방형 결과 집합이 있습니다.
- 연결에서 데이터베이스를 Azure SQL 전환했습니다.
- 열려 있는 트랜잭션이 있습니다.