Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解决;“套接字读取超时”;使用hikari连接池时_Java_Database_Playframework_Oracle12c_Socket Timeout Exception - Fatal编程技术网

Java 如何解决;“套接字读取超时”;使用hikari连接池时

Java 如何解决;“套接字读取超时”;使用hikari连接池时,java,database,playframework,oracle12c,socket-timeout-exception,Java,Database,Playframework,Oracle12c,Socket Timeout Exception,我正在使用play framework(版本2.8.0)、java(版本1.8)和oracle数据库(版本12C)开发一个应用程序 一天内数据库只有零次或一次点击,我的错误率正在下降 java.sql.SQLRecoverableException: IO Error: Socket read timed out at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:919) at oracle.jdbc.dr

我正在使用play framework(版本2.8.0)、java(版本1.8)和oracle数据库(版本12C)开发一个应用程序

一天内数据库只有零次或一次点击,我的错误率正在下降

java.sql.SQLRecoverableException: IO Error: Socket read timed out
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:919)
    at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:2005)
    at com.zaxxer.hikari.pool.PoolBase.quietlyCloseConnection(PoolBase.java:138)
    at com.zaxxer.hikari.pool.HikariPool.lambda$closeConnection$1(HikariPool.java:447)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketTimeoutException: Socket read timed out
    at oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:174)
    at oracle.net.ns.NIOHeader.readHeaderBuffer(NIOHeader.java:82)
    at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:139)
    at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:101)
    at oracle.net.ns.NIONSDataChannel.readDataFromSocketChannel(NIONSDataChannel.java:80)
    at oracle.jdbc.driver.T4CMAREngineNIO.prepareForReading(T4CMAREngineNIO.java:98)
    at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:534)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:485)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
    at oracle.jdbc.driver.T4C7Ocommoncall.doOLOGOFF(T4C7Ocommoncall.java:62)
    at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:908)
    ... 6 common frames omitted

db {
default {
driver=oracle.jdbc.OracleDriver
url="jdbc:oracle:thin:@XXX.XXX.XXX.XX:XXXX/XXXXXXX"
username="XXXXXXXXX"
password="XXXXXXXXX"
hikaricp {
  dataSource {
    cachePrepStmts = true
    prepStmtCacheSize = 250
    prepStmtCacheSqlLimit = 2048
      }
     }
  }
}
似乎是由于数据库连接不活动导致的,如何解决此问题?
请告诉我是否需要任何其他信息?

您可以为JDBC启用TCP keepalive-可以设置指令,也可以在连接字符串中添加“enable=breake”

  • 通常Cisco/Juniper在TCP连接处于非活动状态超过一小时时会切断它
  • 而Linux内核在两小时后开始发送keepalive探测(tcp_keepalive_时间)。因此,如果您决定打开tcp keepalive,您还需要root用户将此内核可调值更改为较低的值(10-15分钟)
  • 此外,默认情况下,HikariCP不应将任何连接保持打开状态超过30分钟
因此,如果您的FW、Linux内核和HikariCP都使用默认设置,那么在您的系统中不应该发生此错误

见HikariCP

最大寿命: 此属性控制中连接的最大生存期 水塘正在使用的连接将永远不会失效,只有当它处于禁用状态时才会失效 关闭,然后将其移除。在一个接一个的基础上, 采用较小的负衰减,以避免环境中的大灭绝 水塘我们强烈建议设置此值,并且应 比任何数据库或基础设施都要短几秒钟 连接时间限制。值为0表示没有最大生存期 (无限寿命),当然受idleTimeout设置的影响。这个 最小允许值为30000ms(30秒)。默认值:1800000(30) (分钟)


我在配置文件中添加了Hickarip的以下配置,它是 工作很好

## Database Connection Pool

play.db.pool = hikaricp
play.db.prototype.hikaricp.connectionTimeout=120000
play.db.prototype.hikaricp.idleTimeout=15000
play.db.prototype.hikaricp.leakDetectionThreshold=120000
play.db.prototype.hikaricp.validationTimeout=10000
play.db.prototype.hikaricp.maxLifetime=120000

我在问题中添加了DB配置,以了解更多详细信息。是否建议在生产过程中保持HikariCP连接打开30分钟以上?