【问题标题】:Java & Postgres Multi-threading FailureJava 和 Postgres 多线程失败
【发布时间】:2021-07-23 20:13:19
【问题描述】:

上下文

Spring Batch 应用程序和 Postgres 托管在同一台服务器上。

Spring Batch Step 以多线程方式运行,执行 SELECT 查询。

Spring Batch Step 正确执行了一段时间,然后在对 Postgres 执行查询时随机遇到以下错误。

错误

2021-04-29 20:57:31.974 [SimpleAsyncTaskExecutor-1] ERROR org.springframework.batch.core.step.AbstractStep - Encountered an error executing step ECIP_TN in job ECIP_tom_JOB
com.lit.tom.core.exception.ApplicationException: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is org.postgresql.util.PSQLException: Connection to 127.0.0.1:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
        at com.lit.tom.core.driver.retriever.sql.SqlRetriever.getData(SqlRetriever.java:98) ~[tom-engine-1.2.11-SNAPSHOT.jar!/:1.2.11-SNAPSHOT]
        at com.lit.tom.core.driver.retriever.LegacyDataRetriever.retrieveLegacyRecords(LegacyDataRetriever.java:48) ~[tom-engine-1.2.11-SNAPSHOT.jar!/:1.2.11-SNAPSHOT]
        at java.lang.Thread.run(Thread.java:748) [?:1.8.0_292]
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is org.postgresql.util.PSQLException: Connection to 127.0.0.1:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
        at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82) ~[spring-jdbc-5.2.13.RELEASE.jar!/:5.2.13.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:371) ~[spring-jdbc-5.2.13.RELEASE.jar!/:5.2.13.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:452) ~[spring-jdbc-5.2.13.RELEASE.jar!/:5.2.13.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:462) ~[spring-jdbc-5.2.13.RELEASE.jar!/:5.2.13.RELEASE]
        at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:490) ~[spring-jdbc-5.2.13.RELEASE.jar!/:5.2.13.RELEASE]
        at com.lit.tom.core.driver.retriever.sql.SqlRetriever.getData(SqlRetriever.java:59) ~[tom-engine-1.2.11-SNAPSHOT.jar!/:1.2.11-SNAPSHOT]
        ... 78 more
Caused by: org.postgresql.util.PSQLException: Connection to 127.0.0.1:5432 refused. Check that the hostname and port are correct and that the postmaster is accepting TCP/IP connections.
        at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:303) ~[postgresql-42.2.19.jar!/:42.2.19]
        at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) ~[postgresql-42.2.19.jar!/:42.2.19]
        at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:223) ~[postgresql-42.2.19.jar!/:42.2.19]
        at org.postgresql.Driver.makeConnection(Driver.java:465) ~[postgresql-42.2.19.jar!/:42.2.19]
        at org.postgresql.Driver.connect(Driver.java:264) ~[postgresql-42.2.19.jar!/:42.2.19]

        ... 78 more
Caused by: java.net.ConnectException: Cannot assign requested address (connect failed)
        at java.net.PlainSocketImpl.socketConnect(Native Method) ~[?:1.8.0_292]
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) ~[?:1.8.0_292]
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) ~[?:1.8.0_292]
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) ~[?:1.8.0_292]
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) ~[?:1.8.0_292]
        at java.net.Socket.connect(Socket.java:607) ~[?:1.8.0_292]

调查工作

Postgres

Postgres 正在运行,并在该端口上接受数据。

#Relevant postgres configuration
#listen_addresses = 'localhost'
max_connections = 100
port = 5432

Java

  • 线程越多,错误越快。
  • 8、6、4 和 2 个线程失败。
  • 单线程运行良好。

我不知道该看什么,任何帮助将不胜感激。

【问题讨论】:

  • 您可能达到了最大连接数限制?如果您不知道,那么作为一个实验,将其增加到 1000 并查看行为是否发生变化。
  • @404 值得一试,但我不知道如何使用 8 个活动线程达到 100 个连接。
  • 取决于如何控制连接生命周期。您是自己创建连接吗?它们是否被妥善处理?如果这不是连接限制问题,那么我真的想不出一个好的理由。 pg 是在本地运行还是在另一台服务器上运行?我对本地 pg 服务器做了非常高的负载,从来没有遇到过这个问题。可能还值得检查 pg 日志文件,以查看当时是否有任何错误记录在那里。

标签: java spring postgresql database-connection


【解决方案1】:

我发现了这个问题,并且和这篇文章中的 cmets 一致。

已达到最大连接数。

错误来自子项目,他们已将 DataSource 从 HikariCP 更改为 DriverManagerDataSource

相关文档sn-p:

注意:这个类不是一个实际的连接池;它实际上并不池连接。它只是作为成熟连接池的简单替代品,实现了相同的标准接口,但在每次调用时都会创建新的连接。

解决方案是改回 HikariCP。

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    相关资源
    最近更新 更多