网站可以做系统还原吗,株洲电商网站建设,seo是什么意思seo是什么职位,wordpress邮箱设置转载自 注意#xff1a;阿里Druid连接池监控的两个坑阿里的Druid大家都知道是最好的连接池#xff0c;其强大的监控功能是我们追求的重要特性。但在实际情况中也有不少坑#xff0c;说下最近遇到的一个坑吧#xff01;
问题1#xff1a;不断打印error级别的错误日志sessio…转载自 注意阿里Druid连接池监控的两个坑阿里的Druid大家都知道是最好的连接池其强大的监控功能是我们追求的重要特性。但在实际情况中也有不少坑说下最近遇到的一个坑吧
问题1不断打印error级别的错误日志
session ip change too many下面是其报错的关键源码
com.alibaba.druid.support.http.stat.WebSessionStat#addRemoteAddresspublic 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.DruidWebUtilspublic 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%AEWebStatFilterinit-paramparam-namesessionStatEnable/param-nameparam-valuefalse/param-value
/init-param
2、修改源码如果有多段IP截取第一段并修改记录访问IP256位的长度
作者去看了阿里最新的包此问题还存在。并且Github上的Druid官方错误申报里面也有同样的问题阿里也没有修复的意思所以我们已暂时关闭session监控功能。
问题2DruidStatView类异常
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监控。
很好奇阿里工程师都这种水平吗还是为了偷懒