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

无力吐槽。。

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

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

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

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

推荐阅读

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

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

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

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

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

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

    转载自 注意:阿里Druid连接池监控的两个坑 阿里的Druid大家都知道是最好的连接池,其强大的监控功能是我们追求的重要特性.但在实际情况中也有不少坑,说下最近遇到的一个坑吧! 问题1:不断打印er ...

  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. 【iCore3 双核心板】例程十七:USB_MSC实验——读/写U盘(大容量存储器)
  2. nsTimer的简单用法
  3. 【Mongodb】 Replica set的主从切换测试
  4. Oracle之索引、权限
  5. JavaScript ES2021 最值得期待的 5 个新特性解析
  6. 活得太累,只因为你索求的太多
  7. QUIC/HTTP2相关资料整理
  8. 安装sqoop以后,hive中的info信息无法禁止的问题解决
  9. 推荐几个干货超多助你成长的前端大佬
  10. Inception-v4,Inception-ResNet论文笔记
  11. 快速浏览Silverlight3 beta:鸡肋一样的WritableBitmap
  12. 延迟退休板上钉钉,专家:男女延至同龄为好!如何延?35 岁“歧视线”又如何破?...
  13. HTTP协议学习总结三(常见http响应头)
  14. 连接摄像头拍照并识别图片中二维码
  15. 关于DCT变换、DCT反变换、分块DCT变换
  16. 武汉大学计算机转专业2021,通知|关于做好2021年普通本科生转专业工作的通知...
  17. 判断是否多喝一瓶酸奶
  18. 程序设计学习(c++)(课堂学习2)
  19. LOL:各服务器王者段位人数改动,越南菲律宾与韩国并列共300人
  20. MFC实现五子棋游戏

热门文章

  1. [原创]使用ajaxFileUpload.js上传文件时附带额外参数。
  2. static使用方法小结
  3. LeetCode14.最长公共前缀 JavaScript
  4. No 'Access-Control-Allow-Origin' header is present on the requested resource.
  5. DS实验题 Floyd最短路径 Prim最小生成树
  6. javaweb学习总结二十五(response对象的用法一)
  7. 如何用windows系统访问Linux系统的web网站
  8. Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)
  9. squid 安装、配置、优化
  10. 深入讨论PHP5对象复制技术