연결 복원력(JDBC)

JDBC 드라이버 다운로드

연결 복원력을 통해 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 전환했습니다.
  • 열려 있는 트랜잭션이 있습니다.