【连接池性能之druid】Connection Close的问题,通过配置Druid的泄露检测机制解决

87 篇文章 4 订阅
23 篇文章 3 订阅

removeAbandoned实际上就是Druid的泄露检测机制。removeAbandoned作为开启连接泄露检测机制的开关,默认为false,当为true的时候,在随着DestroyTask的调用频率定期检测。主要的参数有:

removeAbandoned如果连接泄露,是否需要回收泄露的连接,默认false;spring.datasource.druid.removeAbandoned=true
logAbandoned如果回收了泄露的连接,是否要打印一条log,默认false;
removeAbandonedTimeoutMillis连接回收的超时时间,默认5分钟;spring.datasource.druid.removeAbandonedTimeout=300000

异常问题

org.apache.ibatis.exceptions.PersistenceException: 
### Error rolling back transaction.  Cause: java.sql.SQLException: connection closed
### Cause: java.sql.SQLException: connection closed
        at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.rollback(DefaultSqlSession.java:240)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.rollback(DefaultSqlSession.java:231)
        at com.istrong.ec.dao.MybatisSqlDao.rollback(MybatisSqlDao.java:80)
		... ... 
        at java.lang.Thread.run(Thread.java:750)
Caused by: java.sql.SQLException: connection closed
        at com.alibaba.druid.pool.DruidPooledConnection.checkStateInternal(DruidPooledConnection.java:1190)
        at com.alibaba.druid.pool.DruidPooledConnection.checkState(DruidPooledConnection.java:1181)
        at com.alibaba.druid.pool.DruidPooledConnection.getAutoCommit(DruidPooledConnection.java:769)
        at org.apache.ibatis.transaction.jdbc.JdbcTransaction.rollback(JdbcTransaction.java:78)
        at org.apache.ibatis.executor.BaseExecutor.rollback(BaseExecutor.java:256)
        at org.apache.ibatis.executor.CachingExecutor.rollback(CachingExecutor.java:126)
        at org.apache.ibatis.session.defaults.DefaultSqlSession.rollback(DefaultSqlSession.java:237)
        ... 6 more

解决处理

spring:
  datasource:
    dynamic:
      druid:
        remove-abandoned: true
        remove-abandoned-timeout-millis: 300000

spring:
  datasource:
    dynamic:
      druid:
        fail-fast: true
        # 配置监控统计拦截的filters
        filters: slf4j,stat
        # 配置从连接池获取连接等待超时的时间
        max-wait: 2000
        # 5.7之后支持游标,是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大;
        pool-prepared-statements: false
        query-timeout:
        # 连接泄露检查,打开removeAbandoned功能 , 连接从连接池借出后,长时间不归还,将触发强制回连接。回收周期随timeBetweenEvictionRunsMillis进行,如果连接为从连接池借出状态,并且未执行任何sql,并且从借出时间起已超过removeAbandonedTimeout时间,则强制归还连接到连接池中
        remove-abandoned: true
        # 检查连接泄露依据(超时时间)removeAbandonedTimeoutMillis(默认5分钟):连接回收的超时时间;设置了removeAbandoned为true,Druid会定期检查线程池溢出的情况,如果不是运行状态,且超过设置的时间就会被回收;
        remove-abandoned-timeout-millis: 300000
        slf4j:
          enable: true
          statement-executable-sql-log-enable: true
        # testOnBorrow(默认true):建议配置为false,申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。  
        test-on-borrow: false
        # testOnReturn(默认false):建议配置为false,归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能;
        test-on-return: false
        # testWhileIdle(默认false)是一个检测配置项:建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效;
        test-while-idle: true
        # 创建initialSize个连接
        initial-size: 8
        # 线程池中最大连接数
        max-active: 30
        # minIdle:线程池最小空闲数,Druid会定期扫描连接数情况,如果扫描的值大于该值就关闭多余的连接数,小于就创建符合要求的连接数;这个参数的主要用处是突然有大量的请求的时候,就会创建新的连接数,这是个比较耗时的操作;
        min-idle: 5
        # 配置一个连接在池中最小生存的时间,单位是毫秒
        min-evictable-idle-time-millis: 180000
        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
        time-between-eviction-runs-millis: 60000
 

其他附件

Druid源码阅读8-DruidDataSource的removeAbandoned机制

MySQL优化

Druid连接池默认配置和坑

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
druid数据库连接池是一个开源的Java数据库连接池。它通过提供高效的、可靠的连接管理和监控功能,帮助开发人员更好地管理数据库连接并提高系统性能。使用druid连接池,你可以实现数据库连接的复用、连接的自动管理、连接的监控和统计等功能。 在使用druid连接池时,你需要按照以下步骤进行配置和使用: 1. 添加druid依赖:在项目的pom.xml文件中添加druid的依赖。 2. 配置数据源:在项目的配置文件中配置druid数据源的相关信息,包括数据库的URL、用户名、密码等。 3. 初始化数据源:在项目启动时,通过编程方式初始化druid数据源,并将其注册到JNDI或者使用Spring等框架进行管理。 4. 获取连接:通过druid数据源的getConnection()方法获取数据库连接。 5. 使用连接:使用获取到的数据库连接执行SQL语句,进行数据库操作。 6. 关闭连接:在使用完数据库连接后,务必通过调用connection.close()方法将连接释放回连接池。 除了基本的数据库连接管理功能,druid还提供了一些高级特性,例如: - 连接池的监控功能:可以通过配置druid的监控管理页面,实时查看连接池的状态、活动连接数、慢SQL等信息。 - SQL防火墙功能:可以对SQL进行实时监控和审计,以防止SQL注入等安全问题。 - 配置参数的动态修改:可以通过监控管理页面或者JMX接口动态修改连接池配置参数,而无需重启应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值