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

yizhihongxing

下面是详细讲解“阿里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日

相关文章

  • MySQL修改、删除数据库表字段

    MySQL是一款常用的关系型数据库管理系统,提供了相应的命令和语法来对表进行修改和删除字段。本文将详细介绍MySQL修改、删除表字段的方法,并给出实例说明。 MySQL修改表字段的方法 修改字段名称 使用ALTER TABLE语句,可用于修改字段的名称。 语法: ALTER TABLE 表名 RENAME COLUMN 原字段名 TO 新字段名; 示例如下:…

    MySQL 2023年3月9日
    00
  • 本地Windows远程桌面连接阿里云Ubuntu 16.04服务器的操作方法

    以下是详细的操作方法,让您可以在本地Windows系统中远程连接到阿里云Ubuntu 16.04服务器: 1. 确保防火墙已开放22端口 在您的阿里云服务器中,打开一个终端窗口并输入以下命令: sudo ufw allow 22/tcp 此命令将允许远程桌面协议连接到您的服务器。 2. 安装桌面环境和远程桌面软件 在终端中,输入以下命令: sudo apt …

    database 2023年5月22日
    00
  • springboot整合mongodb并实现crud步骤详解

    下面是关于“springboot整合mongodb并实现crud步骤详解”的完整攻略: 概述 springboot是一款非常方便的java web开发框架,也支持与mongodb数据库进行配合使用。在这篇攻略中,我们将介绍如何使用springboot整合mongodb,并实现crud操作。 步骤 添加依赖 在springboot项目的pom.xml文件中添加…

    database 2023年5月22日
    00
  • SQL语法 分隔符理解小结

    下面我来详细讲解一下“SQL语法 分隔符理解小结”的攻略。 理解分隔符 SQL语言中,分隔符一般用于表示语句的结束。在MySQL中,默认的分隔符是分号(;)。在执行SQL语句时,我们需要在SQL语句的最后加上一个分号,表示该条语句已经结束。 但是,当我们需要在一个SQL语句中定义一个存储过程、触发器或函数时,我们需要在其中嵌套SQL语句,这时候如果每个SQL…

    database 2023年5月21日
    00
  • mysql函数日期和时间函数汇总

    Mysql函数日期和时间函数汇总 MySQL 提供了很多内置日期和时间相关的函数,可以用来在查询中进行日期和时间的计算、格式化等操作,本文将总结并介绍这些函数的使用。 日期和时间类型 在介绍函数之前,我们先来了解一下MySQL支持的日期和时间类型。 DATE:日期类型,格式为YYYY-MM-DD。 TIME:时间类型,格式为HH:MM:SS。 DATETIM…

    database 2023年5月22日
    00
  • MYSQL优化之数据表碎片整理详解

    MYSQL优化之数据表碎片整理详解 什么是数据表碎片? 在MySQL中,当数据表中的记录被频繁的删除或更新时,会造成数据表中的物理存储空间产生碎片化,这些碎片所占的空间虽然很小,但是对于系统的性能会产生严重的影响,严重时可能会导致性能下降甚至是整个系统的崩溃。所以,MySQL数据库的管理员需要定期对数据表进行碎片整理。 数据表碎片整理的目的 数据表碎片整理主…

    database 2023年5月19日
    00
  • mysql的sql语句特殊处理语句总结(必看)

    mysql的sql语句特殊处理语句总结(必看) 在mysql中,我们常常需要对查询结果进行特殊处理,比如去重、排序、分组、计数等等,这时候就需要用到一些特殊处理语句。本文总结了mysql的常见特殊处理语句及其用法,希望能够帮助大家更好地处理数据。 去重 去重是经常需要用到的操作,mysql中可以通过DISTINCT关键字进行去重。例如,以下SQL语句可以从u…

    database 2023年5月21日
    00
  • Linux系统中在虚拟机上搭建DB2 pureScale的方法

    下面是详细讲解在Linux系统下如何在虚拟机上搭建DB2 pureScale的方法: 准备工作 虚拟机及操作系统的安装 首先,我们需要安装一个虚拟机来搭建DB2 pureScale系统,可以使用 Oracle VirtualBox 等虚拟机软件。接着,需要在虚拟机上安装 Linux 操作系统。 下载及安装 DB2 pureScale 软件 从 IBM 官网下…

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