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

相关文章

  • [视频教程] 使用docker的方式安装redis

    直接使用docker拉取redis的镜像,并且进行端口映射与文件目录共享,这样可以直接在宿主机的端口上就可以进行访问了。其实本质上也是在一个简化版的ubuntu的容器内安装好的redis-server服务。 将docker修改为163镜像源在/etc/docker/daemon.json文件中添加下面参数{ “registry-mirrors” : [“ht…

    Redis 2023年4月11日
    00
  • Flume+Kafka+Storm+Redis 大数据在线实时分析

    1、实时处理框架 即从上面的架构中我们可以看出,其由下面的几部分构成: Flume集群 Kafka集群 Storm集群 从构建实时处理系统的角度出发,我们需要做的是,如何让数据在各个不同的集群系统之间打通(从上面的图示中也能很好地说明这一点),即需要做各个系统之前的整合,包括Flume与Kafka的整合,Kafka与Storm的整合。当然,各个环境是否使用集…

    Redis 2023年4月13日
    00
  • 异步的SQL数据库封装详解

    异步的SQL数据库封装主要是基于Python异步协程框架 asyncio 和 Python 的异步数据库 API – aiomysql 构建的,它优雅地解决了在异步编程场景下使用SQL数据库的繁琐问题。下面是使用异步的SQL数据库封装详解的完整攻略。 异步的SQL数据库封装使用攻略 引入异步的SQL数据库封装 在使用异步的SQL数据库封装前,需要在Pytho…

    database 2023年5月21日
    00
  • Oracle数据库中 call 和 exec的区别

    题目要求讲解“Oracle数据库中 call 和 exec的区别”,我将从以下几个方面进行讲解: call 和 exec 的概念解释; call 和 exec 的语法和用法区别; 总结。 1. call 和 exec 的概念解释 在 Oracle 数据库中,call 和 exec 都用于调用存储过程(StoredProcedure)。存储过程是一组预编译的 …

    database 2023年5月21日
    00
  • 阿里云主机一键安装lamp、lnmp环境的shell脚本分享

    阿里云主机一键安装LAMP、LNMP环境的Shell脚本分享攻略 在阿里云这样的云服务商中,我们可以快速搭建Web服务器并运行各种Web应用。常见的Web服务器有两种环境:LAMP环境(Linux + Apache + Mysql + PHP)和LNMP环境(Linux + Nginx + Mysql + PHP)。在Apache和Nginx之间选取一个,是…

    database 2023年5月22日
    00
  • 解决线上Oracle连接耗时过长的问题现象

    解决线上Oracle连接耗时过长的问题现象 如果在线上应用中,连接Oracle数据库的时间过长,会对用户体验产生严重影响。此时需要对问题进行定位并解决。 定位问题 使用strace命令,跟踪进程的系统调用,查看连接Oracle数据库的耗时情况,定位具体问题。 bash strace -ttTx -p pid -e trace=network -f -o /t…

    database 2023年5月22日
    00
  • linux 服务版安装简易说明书

    Linux 服务版安装简易说明书 简介 本文将介绍Linux服务版的安装过程,并提供两个示例以说明安装过程。安装包版本为CentOS 7.4。 前置条件 在开始安装之前,请确保您已经满足以下条件: 一台安装了CentOS 7.4的机器 足够的磁盘空间和内存,至少需要20GB的磁盘空间和2GB的内存 管理员权限 安装过程 以下为Linux服务版的安装过程: 进…

    database 2023年5月22日
    00
  • 在Oracle数据库中同时更新两张表的简单方法

    对于在Oracle数据库中同时更新两张表的简单方法,可以采用以下几种方式实现。 使用触发器 在数据库中创建触发器,当第一张表被修改时,自动更新第二张表的对应数据。下面是一个示例: CREATE OR REPLACE TRIGGER update_second_tableAFTER INSERT OR UPDATE OR DELETE ON first_tab…

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