Доброе утро,
У меня возникла следующая проблема: это стандартное приложение 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 минут)