注意:阿里Druid连接池监控的两个坑
2018-02-28 22:31
639 查看
阿里的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面试题,以及前沿热门资讯等。
相关文章推荐
- 阿里druid 连接池监控数据自定义存储
- 技术杂记-改造具有监控功能的数据库连接池阿里Druid,支持simple-jndi,kettle
- JDBC连接池、监控组件 Druid
- 基于连接池监控组件druid实现的监控用户在线状态
- Druid连接池及监控在spring中的配置
- MyBatis多数据源配置实现读写分离 发表于 2017-09-29 | 分类于 Database | 常见的数据库连接池有C3P0、DBCP和阿里巴巴的druid,后两个在实际场景中用的比较多
- 阿里连接池druid
- 数据库阿里连接池 druid配置详解
- 阿里Druid连接池配置使用
- JDBC连接池、监控组件 Druid
- [置顶] 【Druid】Druid连接池(二)——配置监控界面
- Druid连接池统一监控系统详解
- 框架篇-Spring+Mybatis整合Druid连接池,并配置SQL监控
- 数据库阿里连接池 druid配置详解
- spring-boot 连接池 druid 的配置及监控
- SpringBoot实践之---Druid连接池的使用和监控配置
- JDBC连接池、监控组件 Druid
- 数据库阿里连接池 druid配置详解
- 阿里Druid连接池配置使用
- [Java] SpringMVC 阿里 ali druid 连接池 Communications link failure 解决方案