注意:阿里Druid连接池监控的两个坑

简介: image阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性。但在实际情况中也有不少坑,说下最近遇到的一个坑吧!问题1:不断打印error级别的错误日志session ip change too many下面是其报错的关键源码com.
image

阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性。但在实际情况中也有不少坑,说下最近遇到的一个坑吧!

问题1:不断打印error级别的错误日志

session ip change too many

下面是其报错的关键源码

com.alibaba.druid.support.http.stat.WebSessionStat#addRemoteAddress

public void addRemoteAddress(String ip) {
    if (remoteAddresses == null) {
        this.remoteAddresses = ip;
        return;
    }

    if (remoteAddresses.contains(ip)) {
        return;
    }

    if (remoteAddresses.length() > 256) {
        LOG.error("session ip change too many");
        return;
    }

    remoteAddresses += ';' + ip;
}

再来看看Druid连接池获取IP的方式

com.alibaba.druid.util.DruidWebUtils

public static String getRemoteAddr(HttpServletRequest request) {
    String ip = request.getHeader("x-forwarded-for");
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getHeader("WL-Proxy-Client-IP");
    }
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
        ip = request.getRemoteAddr();
    }

    return ip;
}

分析其源码

这是阿里Druid连接池的session监控功能,会记录同一个会话ID的所有访问IP记录,当超过256个字符长度时就会打印这个错误日志,但实际功能不受影响。

看了下Druid session监控的页面,同一个会话请求次数并不多,但记录的IP却有问题,一个请求最多的会保存多级代理形成的多段IP(如192.168.1.2,192.168.1.3,192.168.1.4),这样一来5、6次请求就会使访问IP超出256长度从而打印这个错误。

解决方案

1、如果用不到session监控,就关闭此功能;

https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_%E9%85%8D%E7%BD%AEWebStatFilter

<init-param>
  <param-name>sessionStatEnable</param-name>
  <param-value>false</param-value>
</init-param>

2、修改源码,如果有多段IP,截取第一段,并修改记录访问IP(256位)的长度;

作者去看了阿里最新的包,此问题还存在。

[图片上传失败...(image-d1e9ae-1518428788548)]

并且Github上的Druid官方错误申报里面也有同样的问题,阿里也没有修复的意思,所以我们已暂时关闭session监控功能。

问题2:DruidStatView类异常

java.util.ConcurrentModificationException
    at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:394)
    at java.util.LinkedHashMap$ValueIterator.next(LinkedHashMap.java:409)
    at java.util.Collections$UnmodifiableCollection$1.next(Collections.java:1067)
    at com.alibaba.druid.support.http.stat.WebAppStat.getSessionStatDataList(WebAppStat.java:504)
    at com.alibaba.druid.support.http.stat.WebAppStatUtils.getSessionStatDataList(WebAppStatUtils.java:64)
    at com.alibaba.druid.support.http.stat.WebAppStatManager.getSessionStatData(WebAppStatManager.java:100)
    at com.alibaba.druid.stat.DruidStatService.getWebSessionStatDataList(DruidStatService.java:205)
    at com.alibaba.druid.stat.DruidStatService.service(DruidStatService.java:161)
    at com.alibaba.druid.support.http.StatViewServlet.process(StatViewServlet.java:162)
    at com.alibaba.druid.support.http.ResourceServlet.service(ResourceServlet.java:253)

看源码,发现又是session监控的坑

无力吐槽。。

[图片上传失败...(image-2ea705-1518428788548)]

for循环里面重复定义Map,可能在别的地方有元素变动,导致发生ConcurrentModificationException异常。

所以,最后关闭了session监控。

很好奇,阿里工程师都这种水平吗?
还是为了偷懒?

推荐阅读

干货:免费领取2TB架构师四阶段视频教程

面经:史上最全Java高级面试题及答案

工具:推荐一款在线创作流程图、思维导图软件

分享Java干货,高并发编程,热门技术教程,微服务及分布式技术,架构设计,区块链技术,人工智能,大数据,Java面试题,以及前沿热门资讯等。


相关文章
|
4月前
|
druid Java 数据库连接
数据库连接池及Druid使用步骤
数据库连接池及Druid使用步骤
257 2
|
Oracle druid 关系型数据库
阿里Druid连接池的坑。。
Druid的坑 当查询数据库的Clob转换为Oracle Clob类型的时候。
483 0
|
SQL Prometheus 监控
数据库连接池选型 Druid vs HikariCP
springboot 现在官方默认的数据库连接池是 HikariCP,HikariCP的性能从测试的数据上来看也是最高的。
数据库连接池选型 Druid vs HikariCP
|
4月前
|
监控 druid 数据可视化
druid监控配置
druid监控配置
188 0
|
9月前
|
SQL 监控 druid
springboot 集成Druid的监控数据库连接池的最佳实践
Druid是一种高性能的开源数据库连接池,它在Java应用程序中被广泛使用。Druid连接池提供了连接管理、连接池监控、SQL性能监控等功能,能够有效地管理数据库连接,并提供丰富的性能指标和监控报告。 Druid连接池的一些主要特点包括: 连接池管理:Druid可以帮助你管理数据库连接,包括连接的创建、销毁和重用。它提供了连接池配置选项,可以灵活地调整连接池的大小、最大等待时间、验证查询等参数。 监控数据统计:Druid连接池提供了丰富的监控指标,如连接数、活跃线程数、执行SQL次数、慢查询次数、错误次数等。通过这些统计数据,你可以实时了解连接池的使用情况和性能状况。 SQL性能监控:
1754 1
|
druid Java 数据库连接
使用Druid数据库连接池的配置和JDBC连接详情
使用Druid数据库连接池的配置和JDBC连接详情
289 0
|
druid Java 数据库连接
数据库连接池入门(c3p0、Druid)
数据库连接池入门(c3p0、Druid)
221 1
|
druid 数据库
springcloud 整合 druid 阿里的数据库连接池
springcloud 整合 druid 阿里的数据库连接池
274 0
|
SQL 监控 druid
Druid数据库连接池使用体验
这是一篇笔者关于Druid数据库连接池的使用体验,干货满满。
805 0
Druid数据库连接池使用体验
|
SQL 监控 druid
Druid数据库连接池的详细解析!分析说明数据库连接池Druid的参数配置和基本架构
本篇文章中介绍了数据库连接池Alibaba Druid的组成部分以及Druid的作用和基本配置。详细说明了Druid的基本架构,分别介绍了Druid中的实时节点,历史节点,查询节点,协调节点以及索引服务。通过本篇文章的学习,可以对数据库连接池Druid的参数配置和基本架构有清楚的认识。
1245 34
Druid数据库连接池的详细解析!分析说明数据库连接池Druid的参数配置和基本架构

热门文章

最新文章