低访问量时Phoenix 4.10.1 报错Connection is null or closed

张开慧

现象:

Services-kael工程升级之后有时候会抛出phoenix connection is null or closed的错误,然后后续的连接都连不上。紧急处理方案是重启应用,但是过个几天这个问题又会出现。

exception 于是我们决定找出导致问题的原因。

分析:

升级之前,我们使用的是phoenix 4.9.1 + xml配置数据源的方式,升级后使用的是 phoenix 4.10.1 + springboot @Configuration 方式。
一开始我们以为是没配置事务的原因,结果加上之后还是不行,因此排除事务的原因。

datasourceTx useTx 然后,我们怀疑是phoenix4.10.1的bug,跟读代码并没有任何发现,不过我们发现一个可能性,那就是 嵌套使用了三层连接池。 connectionPool 我们开始怀疑是否第一层拿到的连接,正好被第三层关掉了?

然后横向对比其他工程(配置方式和实现方式一样),其他工程并没有出现这个connection is null or closed 异常。区别在于kael这个工程的访问量特别低(最后那个曲线):

grafanaCount 然后监控kael的phoenix连接池,poolingCount一直是1或2,也就是说总有闲置的连接,假如这个连接正好被hbase client关掉了,那么开始的时候那个问题(后续的连接都连不上)就说的通了。 phoenixBefore

解决方法:

去掉一层连接池,最方便的去掉第一层,也就是druid的连接池。

updateConfig 半个多月过去,这个问题没再出现过。查看phoenix连接池,绝大多数情况下没有闲置连接。 phoenixAfter

后续:

但是,druid没用连接池,每次都要创建新的连接,那就避免不了要消耗更多的时间。因此连接池还是有必要的,所以最好再升级一个phoenix版本再看下效果。