一次 Druid 连接池泄露引发的血案

最近某个应用程序老是卡,需要重启才能解决问题,导致被各种投诉,排查问题是Druid 连接池泄露引发的血案。。 异常日志如下: ERROR - com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 50, maxActive 50, creating 0 at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1512) at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1255) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5007) at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5003) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1233) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90) 连接池中的连接数量已经到达最大值了,到了 60 秒还不能创建连接就超时报错了。 问题很明显,肯定是应用程序哪里用了连接但没有释放,全局排查代码又比较艰难,加了三个 Druid 连接池配置项,最终定位并解决了问题。 添加以下配置:

编辑

添加图片注释,不超过 140 字(可选)

这就是连接泄露配置项,如果连接长时间不归还,removeAbandoned 打开状态,超过 removeAbandonedTimeoutMillis 设置的超时时间,将会强制回收连接。 连接池初始化时会启动一个线程,用于检查并回收连接。 参考源码: com.alibaba.druid.pool.DruidDataSource#createAndStartDestroyThread 当 logAbandoned 打开状态时,关闭连接同时会记录当时的堆栈日志,可用于定位到哪些代码打开了连接没关闭。 abandon connection, owner thread: https-jsse-nio-4443-exec-9, connected at : 1573521883837, open stackTrace at java.lang.Thread.getStackTrace(Thread.java:1589) at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1305) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4619) at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:680) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4615) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1225) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1217) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:90) at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:162) ... 这个配置项虽然可用于排查连接池释放问题,但生产环境小心使用,如果有的业务执行事务的时间比较长,会被误回收,小心引发另外一个血案。

                                                                                          资源获取:
大家 点赞、收藏、关注、评论啦 、 查看👇🏻👇🏻👇🏻 微信公众号获取联系方式👇🏻👇🏻👇🏻
精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻
每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Druid连接池可以用于连接和管理ClickHouse数据库。ClickHouse是一个面向在线分析处理(OLAP)的列式数据库管理系统,支持高速的查询和分析大规模数据。 使用Druid连接池可以提高连接的效率和性能。连接池是一种连接管理机制,通过创建和维护一组预先初始化的数据库连接,应用程序可以通过从连接池获取连接来进行数据库访问操作,而不需要频繁地创建和销毁数据库连接。 Druid连接池支持连接的复用和管理,可以有效地减少连接的创建和销毁开销,提高数据库操作的效率。连接池可以通过设置最大连接数和最小空闲连接数,自动管理连接的数量,并根据需要动态调整连接的创建和销毁。 在使用Druid连接池连接ClickHouse时,需要先配置连接池的参数,如连接URL、用户名、密码等。然后可以通过从连接池获取连接来进行数据库操作,如执行查询、插入、更新等操作。使用完毕后,需要通过释放连接的方式将连接返回给连接池,以便其他应用程序可以重用该连接。 Druid连接池还提供了一些额外的特性,如连接的健康检查、连接的超时控制、连接的统计信息等,可以帮助我们更好地管理和监控连接的状态和性能。 总而言之,通过使用Druid连接池连接ClickHouse数据库,可以提高连接的效率和性能,减少连接创建和销毁的开销,并且提供一些额外的特性来管理和监控连接的状态和性能。 ### 回答2: Druid连接池与ClickHouse的结合为企业提供了强大的数据分析和查询功能。Druid是一个用于实时大数据分析的开源分布式数据存储系统,而ClickHouse是一个列式数据库管理系统,专注于高性能的数据存储和查询。 首先,Druid连接池可以通过将ClickHouse作为数据源来实现对ClickHouse数据的访问和查询。通过配置Druid的数据源连接信息,可以将ClickHouse集群加入到Druid连接池中。这样一来,Druid可以将ClickHouse集群中的数据加载到内存中进行高速查询和分析。 Druid连接池与ClickHouse的结合具有以下几个优点。首先,Druid的分段存储机制使得大部分数据都可以在内存中进行操作,因此查询速度非常快。同时,ClickHouse的列式存储方式可以有效地压缩数据,减小存储空间的占用。这样一来,企业可以实现高速的实时数据分析,并且节约存储空间。 其次,Druid与ClickHouse相结合可以实现多维分析。Druid连接池可以将ClickHouse中的数据按照多个维度进行分片和聚合,提供多维度的数据分析功能。企业可以基于Druid连接池对ClickHouse数据进行灵活的查询和分析,获取深入的业务洞察。 最后,Druid连接池与ClickHouse的结合还可以支持高可扩展性。Druid连接池可以通过与ClickHouse集群的横向扩展来处理大规模的数据查询和分析需求。ClickHouse通过水平扩展节点来增加查询和存储的吞吐量,而Druid连接池可以无缝地与扩容的ClickHouse集群进行对接,满足企业日益增长的数据处理需求。 综上所述,Druid连接池与ClickHouse的结合为企业提供了高速、多维的数据分析和查询功能,并支持高可扩展性。这种结合可以帮助企业更好地利用和分析大数据,为业务决策提供准确的依据。 ### 回答3: Druid是一个实时分析大数据的开源项目,而ClickHouse是一个快速的列式存储分析数据库。连接Druid和ClickHouse可以将实时数据分析与大数据存储和查询相结合,从而实现更高效的数据分析和查询。 Druid连接池是一个用于管理Druid连接的工具,它可以提供一个连接池来保存和管理与ClickHouse的连接。连接池的主要作用是优化连接的创建和销毁过程,减少连接的创建和销毁开销,从而提高连接的复用率和效率。 使用Druid连接池连接ClickHouse的步骤如下: 1. 配置Druid连接池:首先,我们需要在Druid的配置文件中设置ClickHouse的连接参数,包括ClickHouse的IP地址、端口、用户名和密码等信息。这样Druid连接池才能正确地建立与ClickHouse的连接。 2. 创建连接:接下来,我们可以通过Druid连接池来创建与ClickHouse的连接。连接池会根据配置文件中设置的参数来创建连接,同时保持连接的可用性和安全性。 3. 使用连接:一旦连接成功建立,我们就可以使用连接来执行各种ClickHouse的操作,例如查询数据、写入数据等。连接池会自动管理连接的生命周期,包括连接的获取、释放和回收等操作。 4. 释放连接:当我们使用完连接后,应该及时释放连接,以便让连接进入连接池进行重复利用。这样可以避免频繁地创建和销毁连接,提高连接的复用率和效率。 连接池能够有效地管理连接资源,提高连接的利用率。通过连接池连接Druid和ClickHouse,我们可以实现高效的实时数据分析和查询,提升数据处理和分析的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值