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

阿里的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位)的长度;

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

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

问题2:DruidStatView类异常

java.util.ConcurrentModificationExceptionat 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监控的坑

无力吐槽。。

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

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

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

阿里Druid连接池监控的两个坑相关推荐

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

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

  2. druid 连接池监控报错 Sorry, you are not permitted to view this page.

    使用Druid连接池的时候,遇到一个奇怪的问题,在本地(localhost)可以直接打开Druid连接池监控,在其他机器上打开会报错: Sorry, you are not permitted to ...

  3. druid连接池监控

    项目中使用的数据库连接池是阿里开源的druid连接池,经常会有一些场景需要监控和统计数据源.sql的执行情况,因此引入druid提供的监控druid monitor. Druid是一个开源项目,源码托 ...

  4. 配置阿里Druid连接池

    Hikari 性能上比 Druid 更好,但是 Druid 有配套的监控安全管理功能 1.pom.xml引入Druid依赖(maven repository官网搜索) 可以这个网址   https:/ ...

  5. druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库

    一.连接池 在普通的数据库访问程序中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的 ...

  6. 使用H2Database+Druid连接池+Spring Data JPA+Ehcache实现CRUD操作

    前言 注:本篇为纯实践篇,主要用于技术整合,介绍如何搭建一个完整全面的Web项目.如果对于技术原理还不了解的童鞋可点击下方链接,学习后在来~ H2数据库教程:H2数据库入门 缓存使用教程:在Sprin ...

  7. alibaba的druid连接池的监控的两种方法

    alibaba的druid连接池的监控的两种场景 一.导入druid包,适用spring.springboot 1.导包(版本自选) 这里省略了数据库的其他包只关注druid的相关 <depen ...

  8. SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面

    一.Druid连接池 1.druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能.功能强大,能防SQL注入,内置Login ...

  9. Druid 1.1.14 发布,阿里开源连接池

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   阿里开源连接池 Druid 1.1.14 发布了.新版本是一个维护版本,主要是连接池修复keepAlive打开时偶发连接泄露的问题. 新版更 ...

最新文章

  1. 【C++】random随机数与【C++11】/rand()和srand()的用法
  2. arguments don‘t support automatic differentiation, but one of the arguments
  3. 批量下载小说网站上的小说(python爬虫)
  4. 5, Data Augmentation
  5. @value 注入静态属性_TP6依赖注入是如何实现的
  6. 无光驱不支持USB设备启动的笔记本,如何使用Ghost来安装系统
  7. mysql 创建用户命令-grant
  8. 各大Asp木马的万能密码
  9. niceScroll滚动条出现在div的左侧(PS:原本应该出现在div右侧)
  10. NiceScroll接管iview table高度自适应变化
  11. Filter 敏感词汇过滤案例
  12. 原生M1 Sketch for mac(专业矢量绘图设计) v86中文激活版功能介绍,支持最新的monterey系统
  13. LZMA解压缩编码算法的使用
  14. angularjs+chosen的使用备忘
  15. 银河麒麟4.0.2安装
  16. android 电源管理
  17. python倒背如流_python基本操作(五)
  18. 删除坑爹甲方软件天珣客户端
  19. 如何去掉“Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8” 提示,删环境变量都不好使
  20. matlab 画非线性曲线,MATLAB实例:非线性曲线拟合

热门文章

  1. 图的建立-邻接表表示(C语言)
  2. [蓝桥杯2016决赛]愤怒小鸟-模拟
  3. [蓝桥杯2019初赛]年号字串-数论+模拟
  4. python通过tkinter界面库实现三角形成立的测试
  5. 网络流与线性规划24题(写了一半,先鸽下了……)
  6. P4055 [JSOI2009]游戏(二分图匹配+博弈)
  7. P2906 [USACO08OPEN]Cow Neighborhoods G 切比雪夫距离 + 并查集 + set
  8. 2021牛客暑期多校训练营1 H Hash Function FFT\NTT
  9. Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树
  10. AcWing 1068. 环形石子合并