最近微服务迁移到docker,docker平台对于超过300s的外部长连接会自动断开,所以要求应用具备自我检测长连接的能力。这其实不是什么难事,mysql,redis等常用的组件都提供自我检测连接的功能,只需要多加几个配置即可,相信SDN也具备这样的能力。大致查看了Neo4j的文档和SDN的一些源码之后,发现可以配置connectionlivenessCheckTimeout和verify来实现。本以为轻松解决这个问题,谁知道查看日志还是出现了连接异常,反复设置了好几个值之后还是报错,看样子光有这两个参数是不够的。继续查找资料,看源码,终于解决了这个问题。
先贴一张架构图:
从上图可以看出,层次结构为:SDN--->OGM--->Neo4jDriver。对connectionlivenessCheckTimeout尝试设置不同的值均未解决问题之后,我怀疑可能是缺少BoltDriver层的某些配置,于是继续去查,还真查到了一个MaxConnectionLifetime,这个值默认为一个小时,问题应该明朗了,将此值调小,应该就能解决问题。坑爹的是,层层封装到SDN之后,Neo4jDriver某些配置值SDN不支持配置。没办法,只能手动初始化这些对象,贴一下代码:
@Bean public Neo4jTransactionManager transactionManager() { return new Neo4jTransactionManager(