세션 또는 여러 스레드 간의 연결을 재사용할 때 고려할 사항¶
Snowflake 드라이버는 상태 저장 연결을 사용합니다. 스레드 간에 동일한 세션이나 연결을 재사용하면 여러 가지 단점이 있습니다. 예를 들어 세션이 초기화되면 기본 데이터베이스, 스키마, 역할 및 매개 변수 세트로 시작됩니다. 연결은 세션을 시작하고 종료하여 세션과 연결 간의 일대일 관계를 설정합니다. 다음 섹션에서는 동시 스레드에서 연결을 재사용할 때 발생하는 일반적인 효과를 중점적으로 설명합니다.
여러 스레드에서 세션 또는 연결 재사용의 효과¶
드라이버 사용자는 종종 멀티스레드 애플리케이션을 만듭니다. 각 스레드에 대해 별도의 세션과 연결을 만드는 대신 다른 스레드에서 세션이나 연결을 재사용하여 오버헤드를 줄일 수 있습니다. 이렇게 하면 다음과 같은 바람직하지 않은 동작이 발생할 수 있다는 점에 유의하십시오.
세션 상태
세션은 현재 데이터베이스, 스키마 및 역할을 추적합니다. 한 스레드에서 이러한 값을 변경하면(예: USE DATABASE) 다른 스레드에 영향을 미칠 수 있습니다. 동일한 테이블을 가진 다른 스키마로 변경하면 스레드가 실수로 잘못된 테이블을 수정할 수 있기 때문에 이 영향은 특히 중요합니다. 또한 한 세션에서 연결 또는 구성 매개 변수를 변경하면 해당 세션을 사용하는 모든 스레드에 영향을 줄 수 있습니다.
트랜잭션 상태
트랜잭션은 한 세션에서 시작될 수 있습니다. 여러 스레드가 해당 세션에 액세스할 수 있는 경우 각 스레드가 동일한 트랜잭션의 데이터를 수정할 수 있으므로 트랜잭션이 커밋되거나 롤백될 경우 데이터가 실수로 유지되거나 손실될 수 있습니다.
시퀀스 카운터
드라이버는 시퀀스 카운터를 사용하여 요청을 다시 시도합니다. 시퀀스 카운터는 세션에 대해 전역적이므로 다른 스레드에서 세션을 재사용하면 실수로 전역 시퀀스 카운터가 변경되어 요청을 다시 시도할 때 예측할 수 없는 동작이 발생할 수도 있습니다.
쿼리 컨텍스트 캐시
성능 향상을 위해 세션은 드라이버별 또는 내부 캐시에서 일부 내부 정보를 추적합니다. 캐시는 쿼리마다 업데이트되므로 한 세션에서 여러 쿼리를 동시에 실행하면 데이터가 손상될 수 있습니다.
마지막 쿼리 ID
연결은 마지막 쿼리 ID 를 추적한 다음 검색하여 사용할 수 있습니다. 두 쿼리가 서로 다른 스레드에서 병렬로 실행되는 경우, 경쟁 조건은 어느 쿼리가 마지막 쿼리 ID 를 설정하는지에 영향을 줄 수 있습니다.
Snowflake 권장 사항¶
가능하면 연결 풀을 사용합니다.
인증자를 자주 인증하지 않기 위해 여러 스레드에서 연결을 재사용하는 경우 연결 풀 사용을 고려해야 합니다. 연결 풀을 사용하면 세션이 종료될 때 종료되지 않고 다음 기회에 사용할 수 있도록 풀로 반환되기 때문에 인증 요청 횟수가 줄어듭니다. 연결 풀을 사용하는 경우에도 애플리케이션에서 특정 쿼리 또는 현재 데이터베이스에만 영향을 미치는 매개 변수를 변경하거나 재설정하지 않도록 주의해야 합니다. 또한 애플리케이션은 연결 풀에 연결을 반환하기 전에 활성 트랜잭션을 커밋하거나 중단할 책임이 있습니다.
비동기 쿼리는 신중하게 사용하십시오.
단일 연결에서 여러 비동기 쿼리를 동시에 시작하거나 비동기 쿼리가 진행 중인 상태에서 동기 쿼리를 시작하면 예측할 수 없는 결과를 초래할 수 있는 경쟁 조건이 발생할 수 있습니다.
추가 인증 최적화를 사용하십시오.
특정 드라이버는 인증 성능을 개선하는 데 사용할 수 있는 다음 최적화 기능 중 일부 또는 전부를 지원합니다.
SSO 토큰 캐시
MFA 토큰 캐시
TOML 구성 파일의 토큰
사용자 지정 토큰 접근자
드라이버 설명서를 확인하여 드라이버가 지원하는 옵션을 확인해야 합니다.
쿼리 컨텍스트 캐시를 비활성화합니다.
여러 스레드에서 세션 및 연결을 재사용하는 것과 관련된 모든 문제를 알고 있지만 여전히 사용하려는 경우 연결 정의에서
DisableQueryContextCache
매개 변수를false
로 설정하여 쿼리 캐시를 비활성화할 것을 권장합니다.