问题描述
我定义了三个事务,其中对传递的不同参数进行选择操作和选择操作。我尝试同时调用此方法。我得到一个错误:
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类型Connection
,Statement
,ResultSet
等通常不是线程安全的 1 。您不应尝试在多个线程的实例上使用。
如果要避免打开多个连接,通常的方法是使用JDBC连接池来管理连接。当线程需要与数据库对话时,它将从池中获得连接。与数据库通话结束后,它将释放回池中。
在PostgreSQL / Hikari情况下:
- 对于PostgreSQL-"Using the driver in a multi-threaded or a servlet environment"
- 对于Hikari-
getConnection()
调用是线程安全的,但是在由多个线程共享时,我找不到任何明确提及连接对象的线程安全的东西。
1-我已经看到它指出符合规范的JDBC驱动程序应该是线程安全的,但是我看不出JDBC规范实际上在何处要求这样做。但是,即使假设确实在某个地方说过,共享连接的线程也需要非常仔细地进行协调,以避免某个线程导致另一线程的结果集“自发”关闭的情况。