2016-07-31 3 views
4

DBCP2 풀을 구성하는 동안, 그리고 documentation에 따라 나는 것으로 나타났습니다 -로 설명 timeBetweenEvictionRunsMillis라는 구성이 :DBCP2 - 유휴 연결은 풀에서 제거되면

사이 잠 (밀리 초) 유휴 오브젝트 축출 기 스레드의 실행. 양수가 아닌 경우 유휴 오브젝트 축출 기 스레드는 실행되지 않습니다. .

기본값은 -1입니다.

축출 기 스레드가 절대로 기본 구성에서 실행되지 않는다는 것을 의미합니까? 그런 다음 구성 매개 변수는 어떻게 적용됩니까 maxIdle - 풀은 유휴 연결 수가 maxIdle보다 큰 경우 유휴 연결을 제거해야합니다.

유휴 연결이 절대 퇴장되지 않도록 기본 구성이 매우 혼란스러워 보입니다.

timeBetweenEvictionRunsMillis 상단에 몇 가지 역할을하는 것으로 보이는 또 다른 구성 인 softMiniEvictableIdleTimeMillis이 있습니다.

이 점에 대한 설명은 엄청난 도움이 될 것입니다.

당분간 나는 내 풀에서 너무 오래 유휴 연결이없는 것을 목표로 (내 생각에는 AWS RDS를 사용하고 있고 거기에 a weird issue이있는 것 같습니다.

BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
    dataSource.setUrl(properties.getProperty("app.mysql.url")); 
    dataSource.setUsername(properties.getProperty("app.mysql.username")); 
    dataSource.setPassword(properties.getProperty("app.mysql.password")); 
    dataSource.setMaxIdle(20); 
    dataSource.setMaxWaitMillis(20000); //wait 10 seconds to get new connection 
    dataSource.setMaxTotal(200); 
    dataSource.setMinIdle(0); 
    dataSource.setInitialSize(10); 
    dataSource.setTestOnBorrow(true); 
    dataSource.setValidationQuery("select 1"); 
    dataSource.setValidationQueryTimeout(10); //The value is in seconds 

    dataSource.setTimeBetweenEvictionRunsMillis(600000); // 10 minutes wait to run evictor process 
    dataSource.setSoftMinEvictableIdleTimeMillis(600000); // 10 minutes wait to run evictor process 
    dataSource.setMinEvictableIdleTimeMillis(60000); // 60 seconds to wait before idle connection is evicted 
    dataSource.setMaxConnLifetimeMillis(600000); // 10 minutes is max life time 
    dataSource.setNumTestsPerEvictionRun(10); 

답변

5

예, 축출 기 스레드는 기본적으로 실행되지 않습니다. 그 이유는 maxIdlemaxTotal의 값이 기본적으로 동일하기 때. 즉, 즉시 닫을 연결이없고 유휴 연결을 제거 할 필요가 없기 때.입니다. 따라서 풀은 쓸모없는 스레드를 실행하지 않아도 리소스를 절약 할 수 있습니다.

maxIdle을 변경하고 축출 기 스레드를 시작하지 않고 maxTotal보다 작게 만들면 연결이 닫히지 않음을 의미하지는 않습니다. 이는 카운트가 maxIdle으로 떨어지지 않을 때까지 지체없이 즉시 해제 될 것임을 의미합니다.

그리고 minEvictableIdleTimeMillissoftMinEvictableIdleTimeMillis가 놀러와 (조심, 문서에 오타가있다, 그것은 ...MinEvictalbe...하지 ...MiniEvictable...이다). 그들 사이의 차이점은 후자가 수행하는 반면에 후자는 minIdle을 존중하지 않는다는 것입니다. minEvictableIdleTimeMillis이 경과 된 경우에만 softMinEvictableIdleTimeMillis이 확인된다는 사실을 감안할 때 약간 까다 롭습니다.

minEvictableIdleTimeMillis=10000softMinEvictableIdleTimeMillis=-1 (기본적으로)이 있다고 가정 해 보겠습니다. 이 경우 유휴 연결은 풀에 10 초 이상 남아 있지 않습니다. 연결 수가 minIdle을 초과하지 않더라도 연결이 닫힙니다. 연결 수를 minIdle보다 낮추면 즉시 새 연결이 생성됩니다.

이제 우리는 minEvictableIdleTimeMillis=10000softMinEvictableIdleTimeMillis=30000이 있다고 가정 해 봅시다. 이 경우 minEvictableIdleTimeMillis을 확인한 후 유휴 연결이 감지되고 초과 감지는 softMinEvictableIdleTimeMillis에 대해 추가로 확인됩니다. 유휴 시간이 초과하면 연결이 닫힙니다.그렇지 않으면 minEvictableIdleTimeMillis에 대한 다음 긍정 검사까지 수영장에 앉을 것입니다.

결국, 당신은 minIdle0 사이의 즉시 폐쇄 maxTotalmaxIdle 사이의 연결, 연결 maxIdleminIdle 사이 minEvictableIdleTimeMillis 후 폐쇄 및 연결 softMinEvictableIdleTimeMillis 후 종료 즉시 재개를해야합니다. 퇴거 점검 기간을 정하거나 잡으십시오.

구성을 사용하면 풀이 20보다 큰 동안 즉시 모든 연결을 닫을 수 있습니다.이 연결은 EvictableIdleTimeMillis에 10을 더했기 때문에 (유휴 상태 일지라도) 10 분에서 20 분까지 유효합니다. 분이 TimeBetweenEvictionRunsMillis입니다.

maxIdlemaxTotal 사이의 큰 차이가있는 잠재적 인 문제에 대해서도 말씀 드리고 싶습니다. maxIdle이 자주 초과 될 것으로 예상되면 늘리는 것이 좋습니다. 그렇지 않으면 닫힌 연결이 TIME_WAIT 상태로 중단되어 네트워크 포트가 다시 채워지기 때문에 데이터베이스에 대한 추가 압력을 야기 할 수 있습니다 (새로운 db 연결을 설정하는 데 상대적으로 많은 작업이 필요하기 때문에) 그리고 응용 프로그램 서버 네트워크 인프라가 필요합니다. 풀).

+0

감사합니다. 10-20 분 동안의 유휴 연결은 연결 풀에서 다시 사용됩니까? 제 추측으로 그들은 재사용 될 것입니다. 두 번째 예에서 '유휴 시간이 초과하면 ...'이라고 말하면 10000 + 30000을 초과합니까? –

+0

고마워, 너 지금 편집을 읽었 어. 꽤 깨끗한 지금 –

+0

@ 바드 마커, 여러분 환영합니다. 연결을 재사용하는 것에 관해서는, 내가 올바르게 질문을 이해한다면, 풀이 필요하다면 풀이 재사용되고 '유휴 타이머'가 리셋됩니다. –