阿里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日

相关文章

  • 如何在Python中删除Redis数据库中的数据?

    以下是在Python中删除Redis数据库中的数据的完整使用攻略。 使用Redis数据库的前提条件 在使用Python连接Redis数据库之前,需要确保已经安装Redis数据库,并已经启动Redis,同时需要安装Python的Redis动redisy。 步骤1:导入模块 在Python中使用redis模块连接Redis数据库。以下是导入redis模块的本语法…

    python 2023年5月12日
    00
  • Centos7使用yum安装Mysql5.7.19的详细步骤

    下面我将详细讲解“CentOS7使用yum安装MySQL5.7.19”的详细步骤,包含以下几个步骤: 1. 更新yum源 在进行任何软件安装之前,都要先更新系统的yum源,以避免因为使用旧版本的软件源而导致安装失败或是存在安全漏洞的情况。在终端中输入以下命令: sudo yum update 2. 添加MySQL Yum Repository 由于CentO…

    database 2023年5月22日
    00
  • 使用SpringCache进行缓存数据库查询方式

    使用SpringCache进行缓存数据库查询,可以大大提高系统的性能,下面是使用SpringCache进行缓存数据库查询的完整攻略: 什么是SpringCache SpringCache是SpringFramework提供的一个轻量级的缓存框架,它提供了一套缓存注解,可以很容易地实现缓存。 SpringCache的特点在于它可以与多种缓存提供商集成,比如内存…

    database 2023年5月22日
    00
  • scrapy数据存储在mysql数据库的两种方式(同步和异步)

    Scrapy是一个用于爬取网页并提取数据的Python框架。在爬取数据后,我们需要把数据保存到数据库中进行后续处理,使其更方便的进行分析和应用。Scrapy支持将数据存储到多种不同类型的数据库中,其中包括MySQL。在MySQL数据库中,Scrapy数据存储的主要方式是同步和异步。 同步方式 同步方式是指将数据存储到MySQL数据库时,采用常规的同步方式,遵…

    database 2023年5月18日
    00
  • Redis源码编译安装及简单配置

    Redis官网 安装操作步骤 # 安装必要工具包 [root@centos7 ~]#yum -y install gcc jemalloc-devel # 解压 [root@centos7 ~]#tar xvf redis-5.0.9.tar.gz # 进入目录 [root@centos7 ~]#cd redis-5.0.9/ # 编译安装 [root@ce…

    Redis 2023年4月13日
    00
  • Go语言的代码组织结构详细介绍

    下面是关于Go语言代码组织结构的详细介绍: 目录结构 在开始讲解代码组织结构之前,让我们先来看一下标准的Go语言项目目录结构: project-root/ |- cmd/ | |- main.go | … |- internal/ | |- config/ | | |- config.go | | … | |- pkg1/ | | |- pkg1.g…

    database 2023年5月21日
    00
  • 使用RestTemplate访问https实现SSL请求操作

    使用RestTemplate访问https实现SSL请求操作是非常常见的场景,本攻略将介绍如何使用RestTemplate实现这一功能。 准备工作 在进行RestTemplate访问https之前,我们需要准备以下环节:1. 证书:SSL通讯涉及到证书认证,因此我们需要将SSL证书下载至本地。可以联系网站管理员获取SSL证书。 安装SSL证书:下载完SSL证…

    database 2023年5月21日
    00
  • DFD和ERD的区别

    DFD(数据流程图)和ERD(实体关系图)都是数据建模工具,用于描述系统中数据的流动和关系,但它们的焦点不同。 在数据建模中,DFD通常用于描述数据的流向和转换,强调的是功能和过程的层次,将数据流分解成层次结构,清晰地描述了多个过程发生的顺序和功能,以及它们之间的依赖关系。DFD由多个过程、外部实体、数据存储和数据流组成,其中过程指数据转换的功能,外部实体表…

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