Объект соединения close () не закрывает соединение должным образом - PullRequest
0 голосов
/ 14 мая 2018

Я использую следующий фрагмент для соединения с базой данных

private Connection getConnection(JspWriter out, String host, String dbname,
        String port, String user, String pwd) {
    try {
        if (host == null || dbname == null) {
            throw new IllegalArgumentException("Invalid host or dbname"); 
        }
        String url = "jdbc:mysql://" + host + ":" + port + "/" + dbname; 
        String clazz = "org.gjt.mm.mysql.Driver"; 
        Driver driver = (Driver) Class.forName(clazz).newInstance();
        DriverManager.registerDriver(driver);
        return DriverManager.getConnection(url, user, pwd);
    } catch (Exception e) {
       System.out.println("Exception occured while get connection :"+ e);
   }
    return null;
}

После выполнения запроса я закрываю объект подключения

private JSONArray executeQuery(JspWriter out, Connection connection,String query, Object[] params) throws Exception {

PreparedStatement st = null;
ResultSet rs = null;
try {
    //connection = getConnection();
    st = connection.prepareStatement(query);
    int c = 1;
    for (Object param : params) {
        st.setObject(c++, param);
    }
    rs = st.executeQuery();
    if (rs == null) {
        return null;
    }
    ResultSetMetaData meta = rs.getMetaData();
    List<String> columns = getColumnNames(meta);
    JSONArray json = new JSONArray();
    while (rs.next()) {
        JSONObject obj = new JSONObject();
        for (String column : columns) {
            obj.put(column, rs.getObject(column));
        }
        json.put(obj);
    }
    return json;
} catch (Exception e) {
        System.out.println("Exception occurred while execute query" + e);
} finally {
    try {
        if (rs != null) {
            rs.close();
        } 
    } catch(Exception ex) {
            //Print exception
    }
    try {
        if (st != null) {
            st.close();
        }
    } catch(Exception ex) {
            //Print exception
    } 
    try {
        if(connection != null) {
                connection.close();
        }
        if(connection.isClosed()) {
            connection = null;
            }
        } catch(Exception ex) {
                //Print exception
        }
    }
    return null;
  }

Хотя я закрыл соединение методом .close(). И я проверяю, что соединение закрывается с помощью connection.closed(), и оно возвращает true, указывая, что соединение успешно закрыто.

Как только предел соединения достигает максимума - я получаю DB Connection Exhausted, и мой сервер не может устанавливать дальнейшие соединения.

Может кто-нибудь помочь мне в дальнейшей отладке, пожалуйста.

1 Ответ

0 голосов
/ 14 мая 2018

Не строго связано.Используйте try-with-resources

Начните использовать синтаксис try-with-resources , представленный в Java 7:

try (Connection connection = getConnection();
     PreparedStatement st = connection.prepareStatement(query)) {

    // ...
    try (ResultSet rs = st.executeQuery()) {

        // ...
    }
}

Это гораздо удобнее и меньшесклонны к ошибкам.

Чья ответственность закрыть соединение?

Ответственность за закрытие соединения всегда лежит на логике, которая его открывает.Ваш метод не должен закрывать соединение, если оно не получает его.Вызывающий должен (чью логику вы не опубликовали).В идеале вы все равно используете пул соединений, но это может быть не по теме.

Пример:

// This logic opens the connection by calling getConnection()
// It must also close the connection again, e.g. with try-with-resources
try (Connection connection = getConnection()) {
  doSomething(connection);
}

...
// This logic didn't open a connection. It receives it from someone else
// It mustn't close the connection!
void doSomething(Connection connection) {

  // But if other resources are opened, then they must be closed here:
  try (Statement stmt = connection.createStatement()) {
    doSomething(stmt);
  }
}

..
// Again, this method didn't open the statement, it shouldn't close it
void doSomething(Statement statement) {
  ..
}
...