2016-08-08 5 views
2

저는 Java 서버에서 실행되는 게임을하고 있습니다. 데이터베이스 풀링을 위해 내가 훌륭한 라이브러리입니다 HikariCP를 사용하고 있지만, 이제 다음과 같은 오류 내 방법을 던지고있다 :HikariCP 연결 유출

[Hikari housekeeper (pool HikariPool-0)] WARN com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered for connection [email protected], stack trace follows 
java.lang.Exception: Apparent connection leak detected 
    at nl.finicky.lemonade.database.Database.prepare(Database.java:43) 
    at nl.finicky.lemonade.rooms.RoomFactory.loadRoom(RoomFactory.java:25) 
    at nl.finicky.lemonade.rooms.RoomFactory.<init>(RoomFactory.java:20) 
    at nl.finicky.lemonade.Lemonade.main(Lemonade.java:30) 

는 지금은 연결 누수가 열려있는 연결이 어딘가에 떠있는 것을 의미 것을 알고, 그러나 나는 어디서 어떻게 알아낼 수 없다.

다음은 스택 추적에 따라 오류가 발생하는 데이터베이스 클래스의 메소드입니다.

public PreparedStatement prepare(String query) { 
    PreparedStatement statement = null; 

    try { 
     while (statement == null) { 
      statement = this.dataSource.getConnection().prepareStatement(query, 1); 
// The line triggering the error^

      if (statement != null) { 
       this.databasePool.getStorage(); 
      } 
     } 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } finally { 
     return statement; 
    } 
} 

이것은 진술을 시작하기위한 단순한 기본 방법입니다. 이것을 호출하면 resultSet.close(), preparedStatement.getConnection.close()preparedStatement.close()

을 여전히 호출합니다. 연결이 열려 있다고 알려줍니다.

어떻게 해결할 수 있습니까? 감사!

답변

2

나중에 preparedStatement.getConnection.close()을 호출하면 개의 다른 연결이 만들어지고 닫힙니다.

이런 종류의 패턴으로 수행하려는 작업을 수행 할 수 없습니다. this.dataSource.getConnection().prepareStatement(...)을 호출하면 풀에서 Connection을 가져오고 아무 것도 닫을 수 없으면 참조를 버립니다. 반환 된 PreparedStatement는 사용할 수 없으므로이 메서드에서 Connection을 닫을 수 없습니다. 참조를 유지 한 경우에도 Connection을 닫을 수 없습니다.