最近微服务迁移到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(sessionFactory());
}
@Bean
public SessionFactory sessionFactory() {
return new SessionFactory(ogmDriver(), "com.xxxx.domain");
}
@Bean("ogmDriver")
public Driver ogmDriver()
{
Driver ogmDriver = new BoltDriver(neo4jDriver());
//configure会执行close函数 所以不能在这里加载配置
// ogmDriver.configure(ogmConfiguration());
return ogmDriver;
}
@Bean("neo4jDriver")
public org.neo4j.driver.v1.Driver neo4jDriver() {
Config config = Config.build()
.withConnectionTimeout(10,TimeUnit.SECONDS)
.withConnectionLivenessCheckTimeout(2,TimeUnit.MINUTES)
.withMaxConnectionLifetime( 3, TimeUnit.MINUTES )
.withMaxConnectionPoolSize( 50 )
.withConnectionAcquisitionTimeout( 1, TimeUnit.MINUTES )
.toConfig();
return GraphDatabase.driver( uri, AuthTokens.basic( username, password ), config );
}
请注意代码中的注释,omg在调用配置函数之后会关闭连接池,所以不能在OGM层调用configure实现自定义配置,不过这也无所谓啦,反正可以直接配置neo4jDriver了。
修改之后程序测试通过。总结一下,调用SDN一时爽,一直调用一直爽,一旦遇到问题,只能一脸懵逼,还是要透过框架多看看底层的东西
在Docker环境中,由于超过300s的外部长连接会被自动断开,文章讲述了如何使用Spring Data Neo4j (SDN)配置连接有效性检测以应对这个问题。通过研究Neo4j的文档和源码,发现需要配置connectionlivenessCheckTimeout和verify参数。然而,仅靠这些并未解决问题。进一步研究发现,BoltDriver的MaxConnectionLifetime配置也很关键,将其调整后,解决了连接异常。由于SDN不支持所有Neo4jDriver配置,需要手动初始化相关对象以完成设置。

2178

被折叠的 条评论
为什么被折叠?



