阿里Druid连接池监控的两个坑
转载自 注意:阿里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连接池监控的两个坑相关推荐
- 注意:阿里Druid连接池监控的两个坑
image 阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性.但在实际情况中也有不少坑,说下最近遇到的一个坑吧! 问题1:不断打印error级别的错误日志 session ...
- druid 连接池监控报错 Sorry, you are not permitted to view this page.
使用Druid连接池的时候,遇到一个奇怪的问题,在本地(localhost)可以直接打开Druid连接池监控,在其他机器上打开会报错: Sorry, you are not permitted to ...
- druid连接池监控
项目中使用的数据库连接池是阿里开源的druid连接池,经常会有一些场景需要监控和统计数据源.sql的执行情况,因此引入druid提供的监控druid monitor. Druid是一个开源项目,源码托 ...
- 配置阿里Druid连接池
Hikari 性能上比 Druid 更好,但是 Druid 有配套的监控安全管理功能 1.pom.xml引入Druid依赖(maven repository官网搜索) 可以这个网址 https:/ ...
- druid连接池mysql5.7_Spring Boot 使用Druid连接池整合Mybatis-Plus连接Mysql数据库
一.连接池 在普通的数据库访问程序中,客户程序得到的连接对象是物理连接,调用连接对象的close()方法将关闭连接,而采用连接池技术,客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的 ...
- 使用H2Database+Druid连接池+Spring Data JPA+Ehcache实现CRUD操作
前言 注:本篇为纯实践篇,主要用于技术整合,介绍如何搭建一个完整全面的Web项目.如果对于技术原理还不了解的童鞋可点击下方链接,学习后在来~ H2数据库教程:H2数据库入门 缓存使用教程:在Sprin ...
- alibaba的druid连接池的监控的两种方法
alibaba的druid连接池的监控的两种场景 一.导入druid包,适用spring.springboot 1.导包(版本自选) 这里省略了数据库的其他包只关注druid的相关 <depen ...
- SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面
一.Druid连接池 1.druid简介 Druid连接池是阿里巴巴开源的数据库连接池项目.Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能.功能强大,能防SQL注入,内置Login ...
- Druid 1.1.14 发布,阿里开源连接池
开发四年只会写业务代码,分布式高并发都不会还做程序员? 阿里开源连接池 Druid 1.1.14 发布了.新版本是一个维护版本,主要是连接池修复keepAlive打开时偶发连接泄露的问题. 新版更 ...
最新文章
- 【C++】random随机数与【C++11】/rand()和srand()的用法
- arguments don‘t support automatic differentiation, but one of the arguments
- 批量下载小说网站上的小说(python爬虫)
- 5, Data Augmentation
- @value 注入静态属性_TP6依赖注入是如何实现的
- 无光驱不支持USB设备启动的笔记本,如何使用Ghost来安装系统
- mysql 创建用户命令-grant
- 各大Asp木马的万能密码
- niceScroll滚动条出现在div的左侧(PS:原本应该出现在div右侧)
- NiceScroll接管iview table高度自适应变化
- Filter 敏感词汇过滤案例
- 原生M1 Sketch for mac(专业矢量绘图设计) v86中文激活版功能介绍,支持最新的monterey系统
- LZMA解压缩编码算法的使用
- angularjs+chosen的使用备忘
- 银河麒麟4.0.2安装
- android 电源管理
- python倒背如流_python基本操作(五)
- 删除坑爹甲方软件天珣客户端
- 如何去掉“Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8” 提示,删环境变量都不好使
- matlab 画非线性曲线,MATLAB实例:非线性曲线拟合
热门文章
- 图的建立-邻接表表示(C语言)
- [蓝桥杯2016决赛]愤怒小鸟-模拟
- [蓝桥杯2019初赛]年号字串-数论+模拟
- python通过tkinter界面库实现三角形成立的测试
- 网络流与线性规划24题(写了一半,先鸽下了……)
- P4055 [JSOI2009]游戏(二分图匹配+博弈)
- P2906 [USACO08OPEN]Cow Neighborhoods G 切比雪夫距离 + 并查集 + set
- 2021牛客暑期多校训练营1 H Hash Function FFT\NTT
- Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树
- AcWing 1068. 环形石子合并