문제

연결 풀을 사용하도록 Tomcat을 설정했지만 연결의 MySQL 시간 초과 후에 이전에 풀에서 열려 있던 연결이 열리지 않습니다.내 context.xml 파일은 다음과 같습니다.

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource"
           maxActive="5" maxIdle="3" maxWait="10000"
           username="uname" password="password" driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/>

보시다시피 autoReconnect를 true로 포함했지만 그렇지 않습니다.제한 시간이 설정된 8시간 후에 데이터베이스에서 프로세스를 확인했습니다.

도움이 되었습니까?

해결책

유효성 검사 쿼리 속성을 추가하십시오. 이것은 다음과 같은 시간 초과 후 연결을 자동으로 닫고 재개하는 효과가 있어야합니다.

validationQuery="SELECT 1"

다른 팁

먼저, 제거하십시오 autoReconnect 재산. 연결 풀이 필요하지 않으며 문제가 발생할 수 있습니다.

둘째, 당신을 확인하십시오 닫다 모든 자원 (Connection, Statement 그리고 ResultSet) JDBC 코드에서 finally 차단하다.

이것이 귀하의 경우에 적용되는지 확실하지 않지만 스타터 간의 일반적인 오해는 풀링 된 연결이 발생할 경우 해당 리소스를 닫을 필요가 없다고 생각하는 것 같습니다. 이것은 사실이 아닙니다. 풀링 된 연결은 약간 변경된 연결 주위의 래퍼 (데코레이터)입니다. close() 대략적인 모습

public void close() throws SQLException {
    if (this.connection is still active) {
        do not close this.connection, but just return it to pool for reuse;
    } else {
        actually invoke this.connection.close();
    }
}

다시 말해서, 그들을 닫습니다 자유롭게 풀링 된 연결을 위로 올려서 향후 재사용을 위해 수영장에 다시 넣을 수 있습니다. 연결을 닫지 않고 연결을 획득하면 풀이 조만간 연결되지 않습니다.

이는 긴급하고 생산을 위한 것이므로 다음과 같은 적절한 연결 풀을 살펴보는 것이 좋습니다. c3p0.더욱 강력하고 안정적이며 시간 초과를 더 잘 처리할 수 있습니다.

구성을 사용하면 유휴 상태 인 경우 다른 연결을 생성하지 않아야합니다. 추가하십시오

  minIdle="3"

이 설정을 통해 DBCP는 항상 3 개의 연결을 유지합니다.

우리는 가볍게 사용되는 서버 중 하나에서 정확히 동일한 동작을 본다. 기본 연결 시간 초과 8 시간으로 인해 아침에 올 때 연결이 없습니다. 그것이 우리가 기대했던 것입니다. 그러나 때때로 우리는 오래된 연결을보고 첫 번째 요청이 실패합니다. 이 문제를 해결하려면 다음 속성을 추가해야합니다.

testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top