当前位置: 首页 > 知识库问答 >
问题:

使用Spring的Tomcat数据源池中的所有连接都处于活动状态

邓光耀
2023-03-14

我的Spring Boot应用程序使用JDBCTemplate将SQL查询发送到PostgreSQL数据库。似乎每次模板从池中获取连接时,都不会释放连接。活动连接(datasource.primary.active)的数量一直在增加。

在日志中,使用JDBCTemplate进行SQL查询后,我可以看到:

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
            },

以及用于查询db的代码:

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个答案

赵君植
2023-03-14

Spring boot允许您配置数据源的行为方式。你会在官方文件上找到完整的清单。为您的案例检查以下属性:

spring.datasource.maxActive
spring.datasource.maxIdle

根据您使用的连接池,您还可以使用Spring Boot属性对其进行调优(所有内容都在文档中)。

 类似资料:
  • 我们有一个spring-boot应用程序,它使用嵌入式tomcat进行部署,并使用MySQL后端的默认tomcat-jdbc连接池,而没有为MySQL或tomcat端定制。 该应用程序有一些调度程序,它们主要在一天中的特定时间运行,即在昨天的最后一次cron运行和今天的第一次cron运行之间,有超过9个小时的间隙。然而,无论何时cron在早期运行,它都从未遇到过空闲连接问题。 现在我们看到一条错误

  • 问题设置基于Web服务(Spring/Java、Tomcat7和MySql),其中每个用户都有自己的数据库,因此每个请求都需要自己的连接。由于所有数据库都是在运行时动态创建的,因此在启动之前静态配置它们不是一个选项。 为了优化数据库连接使用,数据库连接池的实现将是非常好的,对吗? 使用Java/Spring:如何为动态数据库创建连接池?我有点惊讶于这里缺少干净的选择 问题:Tomcat的连接池(以

  • 我正在使用配置了多个数据源的Spring Boot 1.5.17。我的一个数据源配置如下。 现在,如何获取或记录此数据源的连接池中的活动连接数?

  • > 可能是我有这个确切的问题https://github.com/brettwooldridge/hikaricp/issues/109在我的例子中,活动连接随着每个事务的增加而增加。 HikariCP-连接不可用这也是一个相同的问题。但没有人对此提供明确的解决方案。顺便说一句,我使用了begging中的。

  • 我正在使用Spring JPA连接到数据源。我的要求是有多个连接池到同一个数据源,这样我就可以根据优先级管理数据库操作 有没有办法让多个连接池具有相同的数据源? 我正在看这个例子,我想做几乎相同的事情,但使用Spring JPA使用相同的数据源

  • 这是我目前的配置 这是在全局上下文中,因此多个应用程序可以使用它。我对parameters.need一些细节有点困惑。我理解的是 池启动时创建的连接数。 一次最多可以激活50个连接。 10个连接在未使用连接时保持空闲,其他连接在 20个连接可以存储为空闲。 但当我启动tomcat服务器时,我可以看到30个空闲连接,这些连接将永远存在。为什么会这样?我错过什么了吗?根据我对连接池的理解,应该只创建1