间歇性连接被拒绝错误似乎与“localhost”被解析为 IPv6

问题描述

我不太确定这个问题是否与 r2dbc-postgresql 有关,但现在它只发生在我们的 R2DBC 连接中,而不是使用 JDBC 的 Liquibase...

我们的小项目有 3 个集成测试,它们使用 Testcontainer 运行 Postgresql支持存储库。 在我们公司集群上构建项目时,我们注意到偶尔某些测试会失败,因为到 localhost/0:0:0:0:0:0:0:1:<container_exposed_port> 的 R2DBC 连接被拒绝。 请注意,所有 3 个测试都依赖于数据库访问,并且当我们重复构建时,它们中的每一个在某些运行中都失败了,即在某些构建中,所有 3 个测试都通过了;在某些构建中,只有测试 1 失败,但 2 和 3 通过;在某些构建中,只有测试 2 失败,但 1 和 3 通过;在某些构建中,测试 1 和 2 失败,但通过了 3 次,依此类推。当一个测试失败时,其他测试仍会运行并可能通过。

我们进行了一些调试,在 netstat -a -n --tcp 中发现表明只有 0.0.0.0:<container_exposed_port> 被监听,而不是 :::<container_exposed_port>

将集成测试的系统属性设置为首选 IPv4 堆栈后,问题就消失了,即

task integrationTest(type: Test) {
    // ...
    systemProperties = ['java.net.preferIPv4Stack': true] as Map<String,Object>
}

在这里感到困惑的是,为什么当未设置 IPv4 首选项时,只有 某些 测试失败。另外,为什么它不会发生在 JDBC 连接上。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)