2017-12-13 3 views
3

내가 슬릭 문서에서이 문을 의아해 오전보다 더 많은 연결을 사용하는 경우 : 풀에서 스레드가보다 트랜잭션 내부의 비 데이터베이스 작업을 시퀀싱 할 때슬릭 스레드

슬릭 더 많은 연결을 사용하는 것이다.

Slick이 트랜잭션을 열고 다른 트랜잭션 (다른 스레드에서)을 사용하여 해당 트랜잭션 내에서 작업을 수행한다는 의미입니까? 내가 맞습니까? 나는 여러 연결 사이에서 트랜잭션을 열어 둘 수 있다고 생각하지 못했습니다.

답변

2

나는 내 이해에 잘못 보입니다.

의가 슬릭 스레드 풀 크기는 1입니다 그리고 우리는

먼저 두 개의 쿼리 A를 실행하고 B. 트랜잭션 1이, 슬릭가 연결 1을 엽니 다 가정 해 봅시다, 단일 스레드를 점유 사용하여 쿼리 A를 실행 스레드 풀에서. 동시에 트랜잭션 2는 실행할 단일 쿼리 C가있는 대기열에 있습니다. 모든 스레드가 점유되면 쿼리 C가 큐에 놓입니다.

한편 쿼리 A는 끝나고 일부 스칼라 코드는 비동기 적으로 실행되어 다른 스레드 풀을 사용하여 결과를 처리합니다. 처리 스레드는 Slick 스레드 풀로 반환됩니다. 그러나 트랜잭션 1이 실행 중일 때 데이터베이스 연결 1은 아직 사용 중입니다.

쿼리 C가 실행될 때 Slick은 사용 가능한 연결이없는 것으로보고 따라서이를 실행하기 위해 새 데이터베이스 연결 2를 만듭니다. 이것은 정확히 문서에서 언급되는 상황입니다 - 스레드 풀 크기가 아니라입니다 1.

동안 우리는이 열려있는 연결을 기본 연결 풀 설정은 다음과 같이 이유 :

  • 당신이 트랜잭션에서 여러 쿼리를 실행하지 않도록하는 경우 기본적으로 numThreads
  • maxConnectionsmaxConnections * 5

같음에 기본적으로 minConnections가 동일하고 슬릭 네브라스카한다 ver 스레드보다 많은 연결을 엽니 다.