Слишком много соединений (новая ошибка)

1

Хорошо, я меняю свой заводский код подключения, я использую класс PoolProperties, и теперь я получаю эту ошибку:

Источник данных отклонил установление соединения, сообщение с сервера: "Слишком много соединений"

В моем методе InsertandGetObject я регистрирую сообщение, чтобы проверить, что соединение закрывается и оно есть, я также debbug на сервере.

Есть идеи по этому вопросу? : s

Это мой пул соединений:

    public static Connection getConnection() throws DatabaseConnectionException {

    PoolProperties p = new PoolProperties();
    p.setName("jdbc/MetaData");
    p.setUrl("jdbc:mysql://localhost:3306/db_name");
    p.setDriverClassName("com.mysql.jdbc.Driver");
    p.setUsername("root");
    p.setPassword("");
    p.setInitialSize(3);
    p.setMaxActive(10);
    p.setMaxIdle(8);
    p.setMinIdle(2);
    p.setRemoveAbandoned(true);
    p.setMaxWait(10000);

    Connection conn = null;



    try {

        DataSource dataSource = new org.apache.tomcat.jdbc.pool.DataSource(p);

        conn = dataSource.getConnection();

    } catch (SQLException e) {
        LOGGER.debug("MSJ SQLExp: " + e.getMessage());
        throw new DatabaseConnectionException(e);

    } 

    return conn;
}

Это метод, который закрывает соединение:

    public Concept insertAndGetObject(Concept object) throws SQLException,
        DatabaseConnectionException {
    try {

        connection = ConnectionFactory.getConnection();
        connection.setAutoCommit(false);
        statement = connection.prepareStatement(INSERT_CONCEPTS);
        statement = ConceptMapperUtil.setStatementParameters(statement,
                object);
        statement.executeUpdate();
        connection.commit();
        LOGGER.debug("Inserted concept row ");
    } catch (SQLException e) {
        connection.rollback();

        if (e.getErrorCode() == SQL_INSERT_ERROR_CODE) {
            LOGGER.debug("Concept already exists!");
        } else {
            throw e;
        }

    } finally {
        object = findConceptByUniqueFk(object.dataSource.getIdDataSource(),
                object.conceptType.getIdConcept(),
                object.idMetadataVersion.getIdMetaDataVersion());
        DbUtil.close(statement);
        // connection.setAutoCommit(true);
        DbUtil.close(connection);
    }
    return object;
}
  • 1
    Не только в связи с вашим вопросом, но почему вы (1) не получаете Concept в начале метода, чтобы избежать использования исключений в качестве «нормальной» бизнес-логики (вставка уже существующей концепции является «нормальной» в вашем flow) и (2) возвращаясь к базе данных в предложении finally, когда есть вероятность, что было выдано серьезное исключение SQLException, и ваше соединение находится в недопустимом состоянии? Этот 2-й пункт может даже объяснить вашу проблему, хотя я не могу сказать с информацией, которую вы предоставили до сих пор.
  • 0
    Я сделал несколько изменений, и теперь я получаю эту ошибку, есть идеи?
Показать ещё 2 комментария
Теги:
tomcat
connection-pooling

1 ответ

2
Лучший ответ

С new DataSource(PoolProperties) вы не создаете "объект DataSource, обертывающий соединение" (как указано в ApiDocs). Вместо этого вы создаете пул соединений (также упоминается в ApiDocs, но вверху: "DataSource просто обертывает ConnectionPool..."). Я проверил это, я думаю, исходный код (см. Строку 108 DataSourceProxy).

Следовательно, закрытие соединения возвращает его в пул (поэтому его можно повторно использовать), он фактически не закрывает соединение (если вы не видите, что соединение фактически закрывается на сервере базы данных, и в этом случае я ошибаюсь), Решение состоит в том, чтобы создать 1 объект DataSource и повторно использовать его для каждого вызова getConnection(). Закройте DataSource/ConnectionPool, когда приложение больше не нуждается в подключении к базе данных.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню