Spring data Neo4j 定时检测连接有效性

在Docker环境中,由于超过300s的外部长连接会被自动断开,文章讲述了如何使用Spring Data Neo4j (SDN)配置连接有效性检测以应对这个问题。通过研究Neo4j的文档和源码,发现需要配置connectionlivenessCheckTimeout和verify参数。然而,仅靠这些并未解决问题。进一步研究发现,BoltDriver的MaxConnectionLifetime配置也很关键,将其调整后,解决了连接异常。由于SDN不支持所有Neo4jDriver配置,需要手动初始化相关对象以完成设置。

        最近微服务迁移到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一时爽,一直调用一直爽,一旦遇到问题,只能一脸懵逼,还是要透过框架多看看底层的东西

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值