阿里Druid数据连接池引发的线上异常解决

下面是详细讲解“阿里Druid数据连接池引发的线上异常解决”的完整攻略。

问题背景

在使用阿里Druid数据连接池时,我们发现线上应用经常会出现一些奇怪的异常,比如连接超时、连接泄露等等。经过排查,发现这些异常都是由于数据连接池引起的。

异常排查

在排查过程中,我们首先查看了应用日志,发现了一些如下的异常信息:

com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 200, maxActive 500, creating 60, initializing 1, destory 60

通过查阅阿里Druid数据连接池的官方文档,我们了解到这个异常信息是由于连接池中的连接被占满且达到最大值,导致获取连接超时而产生的。经过进一步排查,我们发现使用了默认的连接池配置,后经过对连接池配置的参数进行调整,仍然无法解决线上的异常问题。

解决方案

最终,我们找到在连接池配置中新增“testOnBorrow”配置项,将它的值改为true后,解决了这个问题。

dataSource.setTestOnBorrow(true);

由于我们使用了Spring框架,因此在配置文件中加上如下的配置即可:

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">    
    <property name="testOnBorrow" value="true" />
</bean>

经过在线上环境的多次测试,这个问题已经被完全解决了。

示例说明

示例1

假设我们有一个应用,需要从数据库中读取大量数据,并且需要频繁的打开和关闭数据库连接。在应用启动时,我们使用如下的代码初始化连接池:

dataSource.setInitialSize(10);
dataSource.setMaxActive(50);
dataSource.setMinIdle(10);

在使用了一段时间后,我们发现有一部分用户反映应用非常卡顿,而且频繁出现“连接超时”的异常。通过阅读应用日志,我们发现了以下的异常信息:

com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60000, active 200, maxActive 500, creating 60, initializing 1, destory 60

通过查阅阿里Druid数据连接池的官方文档,我们发现这个异常信息是由于连接池中的连接被占满且达到最大值,导致获取连接超时而产生的。因此,我们可以在连接池配置中新增“testOnBorrow”配置项,将它的值改为true,将连接池的配置修改为如下:

dataSource.setInitialSize(10);
dataSource.setMaxActive(50);
dataSource.setMinIdle(10);
dataSource.setTestOnBorrow(true);

修改连接池配置后,我们重新部署了应用,并进行了多次性能测试,发现这个问题被完全解决了。

示例2

像大多数应用一样,我们的应用需要从数据库中读写数据,并且需要使用连接池来管理数据库连接。在使用了一段时间后,我们发现有一部分用户反映无法正常使用我们的应用,而且频繁出现“连接泄露”的异常。通过阅读应用日志,我们发现了以下的异常信息:

com.alibaba.druid.pool.ConnectionPool.logConnectionLeaks(ConnectionPool.java:703)

这个异常信息表明在应用使用过程中,有些连接没有被正确地释放而导致泄露。为了解决这个问题,我们可以在连接池配置中新增“removeAbandoned”配置项,将它的值改为true,并设置“removeAbandonedTimeout”为120秒,将连接池的配置修改为如下:

dataSource.setRemoveAbandoned(true);
dataSource.setRemoveAbandonedTimeout(120);

经过修改连接池配置后,我们重新部署了应用,并进行了多次性能测试,发现这个问题被完全解决了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:阿里Druid数据连接池引发的线上异常解决 - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • Fluent Mybatis让你摆脱Xml文件的技巧

    Fluent Mybatis是Mybatis框架的一种替代方案,基于Java 8中的Lambda表达式和Stream API,使得编写Mybatis映射文件变得更加简单易用。本篇文章将为你介绍如何使用Fluent Mybatis进行Mybatis开发,让你摆脱Xml文件的束缚。 一、基本概念 1.1 数据库连接 在Fluent Mybatis中,数据库连接的…

    database 2023年5月21日
    00
  • 记录一次清理Redis 病毒程序 kdevtmpfsi

    首先贴上情况    一个redis 程序占用cpu 46%,虽然redis-server 有定时清理过期的键,但也不会占用这么高的CPU吧,一般都是0.3%   看看这个进程什么鬼 systemctl status 14561 然后找到了它的父亲进程 在 /var/tmp/kinsing     删除掉 它  /tmp/kdevtmpfsi  和 /var/…

    Redis 2023年4月12日
    00
  • 配置ogg异构oracle-mysql(2)源端配置

    源端配置大致分为如下三个步骤:配置mgr,配置抽取进程,配置投递进程 在源端先创建一张表,记得带主键: SQL> create table ah4(id int ,name varchar(10),primary key(id)); Table created.   1.登陆ogg,配置全局设置 [oracle@ora11g 11.2]$ ./ggsc…

    MySQL 2023年4月12日
    00
  • SQL SERVER性能优化综述(很好的总结,不要错过哦)第1/3页

    我很乐意为你提供有关“SQL SERVER性能优化综述”的完整攻略。下面,我将按照以下步骤进行讲解: 1.简介:介绍为什么要进行SQL SERVER性能优化,以及提升SQL SERVER性能的好处。 2.诊断:讲解如何诊断SQL SERVER性能瓶颈,具体包括SQL SERVER性能诊断工具,如何分析性能日志等。 3.优化:讲解如何进行SQL SERVER性…

    database 2023年5月19日
    00
  • Sql Server 数据库索引整理语句,自动整理数据库索引

    SQL Server 数据库索引整理是指对数据库中的索引进行优化和整理,以提高数据库的查询性能和数据库的执行效率。在实际应用中,索引整理是数据库优化的一个重要方面之一。下面是整理 Sql Server 数据库索引的攻略: 索引整理的步骤 1. 分析数据库中的索引情况 在进行索引整理之前,需要先分析数据库中的索引情况,找出需要整理的索引。可以通过以下 SQL …

    database 2023年5月21日
    00
  • Redis Sentinel实现高可用配置的详细步骤

    Redis Sentinel是Redis官方提供的一种高可用性解决方案,可以保证Redis系统的稳定性和可用性。下面我来介绍Redis Sentinel实现高可用配置的详细步骤。 确认环境 在开始配置Redis Sentinel之前,需要确认环境是否满足要求。Redis Sentinel要求安装的Redis版本是2.8及以上版本。 安装Redis Senti…

    database 2023年5月22日
    00
  • Redis – increment 递增方法 | 处理防重复和并发问题

      慌途L 2019-08-11 15:51:20 21316 收藏 25分类专栏: 日常记录 Redis 文章标签: redis increment 防重复 并发 递增版权 日常记录同时被 2 个专栏收录39 篇文章0 订阅订阅专栏 Redis3 篇文章0 订阅订阅专栏Redis – increment 递增方法 | 处理防重复和并发问题一、使用场景1.有…

    Redis 2023年4月11日
    00
  • MySQL性能优化之路—修改配置文件my.cnf

    MySQL是一种常见的关系型数据库管理系统,配置合理可以提高其性能和吞吐量。在对MySQL进行性能优化时,修改配置文件my.cnf是非常重要的一步。下面我将详细讲解如何进行此项操作。 找到my.cnf文件 在Linux系统上,my.cnf一般位于/etc目录下,可以使用以下命令来查找: find / -name my.cnf Windows系统上,my.cn…

    database 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部