我正在将Spring Boot与hibernate一起使用,一切正常,但是突然间,使用EntityManager查询触发的选择查询不会返回并且需要时间。
但是查询确实会从应用程序中触发,至少它在日志中显示。我还检查了连接池,它在10个连接中有9个是免费的,但是随后的请求耗尽了所有连接。
结果集很小,查询也很小。当应用程序卡住时,我可以连接数据库并获取相同的行而不会出现问题,尽管它最初会冻结约10秒。
更新:更新默认情况下使用hikariCP的spring boot版本后,出现以下异常。
从数据库开始,连接超时不受限制。
""2019-06-23 21:56:08 [HikariPool-1 connection closer] DEBUG com.zaxxer.hikari.pool.PoolBase - HikariPool-1 - Closing connection oracle.jdbc.driver.T4CConnection@16b80bfd failed
"java.sql.SQLRecoverableException: IO Error: Socket read timed out
数据源配置
spring.datasource.hikari.connectionTimeout=30000
spring.datasource.hikari.idleTimeout=600000
spring.datasource.hikari.maxLifetime=1800000
任何想法怎么了
更新2:我编写了一个简单的代码,该代码连接到数据库并获取记录并打印第一行的第一列。它可以工作几个小时,然后引发异常。代码和异常如下。
try{
Connection con = DriverManager.getConnection(props.getProperty("connection"), props.getProperty("user"),
props.getProperty("password"));
// step3 create the statement object
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("select * from ilogix_document");
rs.next();
System.out.println("Document ID " + rs.getInt(1) + " " + new Date());
while (true) {
Thread.sleep(1200000);
stmt = con.createStatement();
rs = stmt.executeQuery("select * from ilogix_document");
rs.next();
System.out.println("Document ID " + rs.getInt(1) + " " + new Date());
}
// step5 close the connection object
} catch (Exception e) {
System.out.println("=========="+ new Date()+"===============");
e.printStackTrace();
}
我已经使用Thread.sleep()来模拟线程池中的空闲连接。
引发的异常如下。
java.sql.SQLRecoverableException: IO Error: Connection timed out (Read failed)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:782)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:897)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1034)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1244)
at oracle.jdbc.driver.OracleStatementWrapper.executeQuery(OracleStatementWrapper.java:420)
at connectionTester.ConnectionTester.main(ConnectionTester.java:54)
Caused by: java.net.SocketException: Connection timed out (Read failed)
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
at java.net.SocketInputStream.read(SocketInputStream.java:170)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at oracle.net.ns.Packet.receive(Packet.java:311)
at oracle.net.ns.DataPacket.receive(DataPacket.java:105)
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:305)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:249)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:171)
at oracle.net.ns.NetInputStream.read(NetInputStream.java:89)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:123)
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:79)
at oracle.jdbc.driver.T4CMAREngineStream.unmarshalUB1(T4CMAREngineStream.java:426)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:390)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:249)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:566)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:202)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:45)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:766)
... 5 more