查询在数据库上触发,但从不返回或长时间发布后未返回

时间:2019-06-18 04:20:30

标签: hibernate jdbc ojdbc oracledb

我正在将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

0 个答案:

没有答案