Tomcat dbcp, драйвер Oracle прерывается 15 минут - PullRequest
0 голосов
/ 19 февраля 2019

Доброе утро,

У меня возникла следующая проблема: это стандартное приложение Spring WS, развернутое в Tomcat 7 на JRE 7. Использование следующего драйвера Oracle:

        <dependency>
            <groupId>oracle.jdbc</groupId>
            <artifactId>ojdbc7</artifactId>
            <version>12.1.0.2.0</version>
        </dependency>

Периодически, но, по-видимому, случайным образом некоторые запросы будут получены приложением, поток будет приостановлен на 15-16 минут, а затем поток успешно завершит работу.

У меня настроен клапан на контейнере,и журналы последовательно выглядят следующим образом:

    WARNING: Thread "ajp-apr-XXXXX" (id=XX) has been active for 65,111 milliseconds (since 2/30/19 5:34 AM) to serve the same request for https://my-endpoint-here and may be stuck (configured threshold for this StuckThreadDetectionValve is 60 seconds). There is/are 6 thread(s) in total that are monitored by this Valve and may be stuck.
    java.lang.Throwable
            at java.net.SocketInputStream.socketRead0(Native Method)
            at java.net.SocketInputStream.read(SocketInputStream.java:152)
            at java.net.SocketInputStream.read(SocketInputStream.java:122)
            at oracle.net.ns.Packet.receive(Packet.java:311)
            at oracle.net.ns.DataPacket.receive(DataPacket.java:105)
            at oracle.net.ano.CryptoDataPacket.receive(Unknown Source)
            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:429)
            at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:397)
            at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
            at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
            at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)
            at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:30)
            at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:762)
            at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:925)
            at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1111)
            at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1792)
            at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1745)
            at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:334)
            at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:460)
            at org.apache.tomcat.jdbc.pool.PooledConnection.validate(PooledConnection.java:394)
            at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:775)
            at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:619)
            at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:188)
            at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:128)
            at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.getTargetConnection(LazyConnectionDataSourceProxy.java:403)
            at org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy$LazyConnectionInvocationHandler.invoke(LazyConnectionDataSourceProxy.java:376)

Через 15 минут в журналах Catalina мы увидим, что поток больше не застревает, и он продолжает работать так, как ожидается, с приложением, в конечном итоге отвечающим на запрос SOAP..

Моим первым инстинктом было то, что это происходило из-за блокировки некоторых данных в базе данных, но у нас нет конфигурации «таймера на 15 минут», чтобы снять блокировку в таком случае.База данных также не испытывала какой-либо чрезмерной блокировки или странной производительности / состояния во время появления этой проблемы.В базе данных есть доступные подключения (даже близко не к максимальным), и я предполагаю, что пул подключений делает то же самое, поскольку при трассировке стека подключение, кажется, назначается и пытается отправить / прочитать данные.

Эта проблемапроисходит по нескольким разным вызовам и в любое время суток.(несколько разных вызовов, означающих, что несколько разных транзакций также приостанавливаются на 15 минут)

...