阿里的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监控。

很好奇,阿里工程师都这种水平吗?

还是为了偷懒?

推荐阅读


资料:成为架构师的十阶段学习资料!

教程:史上最强 Spring Boot & Cloud 教程汇总

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

扫描关注我们的微信公众号,回复 “666” 可获取一套Java并发编程高清视频教程。

注意:阿里Druid连接池监控的两个坑的更多相关文章

  1. 阿里druid连接池监控数据自定义存储

    如何将druid连接池监控到的sql执行效率,连接池资源情况等进行持久化存储,方便系统运维分析优化,以下案例初步测试成功. 第一部: 新建MyDruidStatLogger类实现接口 extends ...

  2. 阿里druid连接池监控配置

    首先在web.xml中添加如下配置: <filter> <filter-name>DruidWebStatFilter</filter-name> <filt ...

  3. Mybatis 搭配 阿里druid连接池 连接 oracle 或 mysql

    DRUID介绍 DRUID是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0.DBCP.PROXOOL等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针 ...

  4. 阿里druid连接池

    1.加入jar包, 下载地址:druid-1.1.0.zip 2.ApplicationContext.xml <!-- druid阿里云连接池 --> <bean name=&qu ...

  5. 结合 spring 使用阿里 Druid 连接池配置方法

    1.数据源 <!-- 配置数据源 --> <bean name="dataSource" class="com.alibaba.druid.pool.D ...

  6. 阿里Druid连接池的坑。。

    Druid的坑 当查询数据库的Clob转换为Oracle Clob类型的时候. java.lang.ClassCastException: com.alibaba.druid.proxy.jdbc.C ...

  7. Druid连接池

    Druid 连接池简介 Druid首先是一个数据库连接池.Druid是目前最好的数据库连接池,在功能.性能.扩展性方面,都超过其他数据库连接池,包括DBCP.C3P0.BoneCP.Proxool.J ...

  8. Spring Boot (四): Druid 连接池密码加密与监控

    在上一篇文章<Spring Boot (三): ORM 框架 JPA 与连接池 Hikari> 我们介绍了 JPA 与连接池 Hikari 的整合使用,在国内使用比较多的连接池还有一个是阿 ...

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

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

随机推荐

  1. 十折交叉验证10-fold cross validation, 数据集划分 训练集 验证集 测试集

    机器学习 数据挖掘 数据集划分 训练集 验证集 测试集 Q:如何将数据集划分为测试数据集和训练数据集? A:three ways: 1.像sklearn一样,提供一个将数据集切分成训练集和测试集的函数 ...

  2. mongodb update操作

    //修改字段名称,把synonymsList表的name_status修改为status db.getCollection('synonymsList').update({}, {$rename : ...

  3. linux 查看cpu,memory

    https://www.cnblogs.com/ctypyb2002/p/9792951.html

  4. 让微信小程序页面之间的通信不在变得困难

    一个开始 小程序开发者总会碰到各种页面之间的通信问题,实现方式也五花八门,比如... 场景还原 首先这是一个电商小程序. 有这样一个需求: 首页某个地方要展示购物车商品数量. 当我在其他页面加购了商品 ...

  5. PHP操作XML方法之SimpleXML

    SimpleXML简介 SimpleXML 扩展提供了一个非常简单和易于使用的工具集,能将XML转换成一个带有一般属性选择器和数组迭代器的对象. 举例XML XML结构部分引用自<<深入理 ...

  6. Redis 小调研

    一. 概况: Redis是一款开源的.网络化的.基于内存的.可进行数据持久化的Key-Value存储系统.它的数据模型建立在外层,类似于其它结构化存储系统,是通过Key映射Value的方式来建立字典以 ...

  7. 代码托管平台--GitHub 使用小结

    一.GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git作为唯一的版本库格式进行托管.在GitHub,用户可以十分轻易地找到海量的开源代码. 很多IT行业的人到求职的 ...

  8. 基于LNMP部署DiscuzX

    [root@nginx~]# unzip ComsenzDiscuz-DiscuzX-master.zip[root@nginxDiscuzX]# mv upload/ /usr/local/ngin ...

  9. linux redis的启动---后台启动

    1.启动redis服务: redis-server 如果想要开启后台进程: 1.找到redis.conf里边的 把no 改为yes. 2.redis-server redis.conf(这个是针对两个 ...

  10. HashMap是不是有序的?

    不是有序的. 有没有有顺序的Map实现类? 有TreeMap和LinkedHashMap. TreeMap和LinkedHashMap是如何保证它的顺序的? LinkedHashMap 是根据元素增加 ...