2016-08-08 2 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 было бы непригодным.