多个线程通过使用Java中的相同连接读取数据库中的同一表?

问题描述

我定义了三个事务,其中对传递的不同参数进行选择操作和选择操作。我尝试同时调用方法。我得到一个错误

o.h.engine.jdbc.spi.sqlExceptionHelper   : sql Error: 0,sqlState: null
    Aug 25,2020 @ 12:16:39.000 2020-08-25 06:46:39.388 ERROR 1 --- [o-9003-exec-630] o.h.engine.jdbc.spi.sqlExceptionHelper   : Hikari - Connection is not available,request timed out after 60000ms.

有时

org.postgresql.util.PsqlException: FATAL: remaining connection slots are reserved for non-replication superuser connections

我是Java新手。请指导我解决此问题。我是否需要编写多线程访问资源或配置问题?

hikari:
                    poolName: Hikari
                    autoCommit: false
                    minimumIdle: 5
                    connectionTimeout: 60000
                    maximumPoolSize: 80
                    idleTimeout: 60000
                    maxLifetime: 240000
                    leakDetectionThreshold: 300000

解决方法

通过使用Java中的相同连接将多个线程读取到数据库中的同一表?

通常来说这是行不通的。 JDBC API类型ConnectionStatementResultSet等通常不是线程安全的 1 。您不应尝试在多个线程的实例上使用。

如果要避免打开多个连接,通常的方法是使用JDBC连接池来管理连接。当线程需要与数据库对话时,它将从池中获得连接。与数据库通话结束后,它将释放回池中。

在PostgreSQL / Hikari情况下:


1-我已经看到它指出符合规范的JDBC驱动程序应该是线程安全的,但是我看不出JDBC规范实际上在何处要求这样做。但是,即使假设确实在某个地方说过,共享连接的线程也需要非常仔细地进行协调,以避免某个线程导致另一线程的结果集“自发”关闭的情况。