Все соединения активны в пуле источников данных Tomcat с помощью Spring

Приложение My Spring Boot использует JDBCTemplate для отправки запросов SQL в базу данных PostgreSQL. Кажется, что каждый раз, когда шаблон получает соединение из пула, соединение никогда не освобождается. Количество активных соединений (datasource.primary.active) всегда увеличивается.

В журналах после SQL-запроса с использованием JDBCTemplate я вижу:

DEBUG o.s.j.d.DataSourceUtils - Returning JDBC Connection to DataSource

Но количество незанятых соединений остается с тем же значением, и количество активных соединений не уменьшается. При достижении максимального значения становится невозможным получить соединение для выполнения запроса.

Итак, я думаю, что нет возврата соединения с пулом источников данных, есть идеи, пожалуйста?

Вот конфигурация источника данных, полученная с помощью Actuator:

  "dataSource": {
        "prefix": "spring.datasource.tomcat",
        "properties": {
            "connectionProperties": null,
            "propagateInterruptState": false,
            "validator": null,
            "useDisposableConnectionFacade": true,
            "defaultCatalog": null,
            "validationInterval": 3000,
            "jmxEnabled": true,
            "ignoreExceptionOnPreLoad": false,
            "logAbandoned": false,
            "commitOnReturn": false,
            "password": "******",
            "maxIdle": 100,
            "testWhileIdle": false,
            "removeAbandoned": false,
            "poolProperties": {
                "dbProperties": {
                    "user": "postgres",
                    "password": "******"
                },
                "url": "jdbc:postgresql://localhost:5432/tvir",
                "driverClassName": "org.postgresql.Driver",
                "defaultAutoCommit": null,
                "defaultReadOnly": null,
                "defaultTransactionIsolation": -1,
                "defaultCatalog": null,
                "connectionProperties": null,
                "initialSize": 10,
                "maxActive": 100,
                "maxIdle": 100,
                "minIdle": 10,
                "maxWait": 30000,
                "validationQuery": "SELECT 1",
                "validationQueryTimeout": -1,
                "validatorClassName": null,
                "validator": null,
                "testOnBorrow": true,
                "testOnReturn": false,
                "testWhileIdle": false,
                "timeBetweenEvictionRunsMillis": 5000,
                "numTestsPerEvictionRun": 0,
                "minEvictableIdleTimeMillis": 60000,
                "accessToUnderlyingConnectionAllowed": true,
                "removeAbandoned": false,
                "removeAbandonedTimeout": 60,
                "logAbandoned": false,
                "name": "Tomcat Connection Pool[1-574817798]",
                "password": "******",
                "username": "postgres",
                "validationInterval": 3000,
                "jmxEnabled": true,
                "initSQL": null,
                "testOnConnect": false,
                "jdbcInterceptors": null,
                "fairQueue": true,
                "useEquals": true,
                "abandonWhenPercentageFull": 0,
                "maxAge": 0,
                "useLock": false,
                "suspectTimeout": 0,
                "dataSource": null,
                "dataSourceJNDI": null,
                "alternateUsernameAllowed": false,
                "commitOnReturn": false,
                "rollbackOnReturn": false,
                "useDisposableConnectionFacade": true,
                "logValidationErrors": false,
                "propagateInterruptState": false,
                "ignoreExceptionOnPreLoad": false,
                "useStatementFacade": true
            },

И код, используемый для запроса БД:

JdbcTemplate jdbcTemplate = appCtx.getBean(JdbcTemplate.class);

ResultSet columns = jdbcTemplate.getDataSource().getConnection().getMetaData().getColumns(null, null, source.getTable().toLowerCase(), null);

String selectList = "";


while (columns.next())
{

    String colName = columns.getString("COLUMN_NAME");
    String colType = columns.getString("DATA_TYPE");


    if(!selectList.equals("")) {
        selectList += ", ";
    }


    if((""+java.sql.Types.INTEGER).equalsIgnoreCase(colType) || 
            (""+java.sql.Types.DOUBLE).equalsIgnoreCase(colType) ||
            (""+java.sql.Types.BIGINT).equalsIgnoreCase(colType) ||
            (""+java.sql.Types.FLOAT).equalsIgnoreCase(colType) ) {
        selectList += "SUM(" + colName + ")";
    } else {
        selectList += "MAX(" + colName + ")";
    }

    selectList += " AS "+colName;
}

            String sql = "SELECT "+selectList+" FROM "+source.getTable()+" "+
                            "WHERE "+source.getDateColumn()+" >= ? "+
                            "AND "+source.getDateColumn()+" <= ? ";


List<Map<String, Object>> results = jdbcTemplate.queryForList(sql, Date.valueOf(startDate), Date.valueOf(endDate));

1 ответ

Spring boot позволяет вам настроить поведение источника данных. Вы найдете полный список на официальном документе. проверьте следующие свойства для вашего случая:

spring.datasource.maxActive
spring.datasource.maxIdle

В зависимости от того, какой пул соединений вы используете, вы также можете настроить его, используя свойства весенней загрузки (все находится в документе) .

Другие вопросы по тегам