Многие потоки находятся в состоянии ОЖИДАНИЯ, и это абсолютно нормально для них.Например, существуют потоки, имеющие следующую трассировку стека:
...
at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
...
Это означает, что потоки ожидают выполнения каких-либо задач.
Однако другие стеки выглядят не очень хорошо.
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at com.mchange.v2.resourcepool.BasicResourcePool.**awaitAvailable**(BasicResourcePool.java:1414)
at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:606)
- locked <0x000000055c2d3ce0> (a com.mchange.v2.resourcepool.BasicResourcePool)
at
com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:526)
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutAndMarkConnectionInUse(C3P0PooledConnectionPool.java:755)
Эти потоки ожидают освобождения соединения в пуле.C3P0 - это пул соединений с базой данных.Вместо того, чтобы каждый раз создавать новое соединение, они кэшируются в пуле.После закрытия само соединение не закрывается, а только возвращается в пул.Таким образом, если по какой-либо причине (или другому пользователю) в спящем режиме не закрывать соединение после освобождения, пул может быть исчерпан.
Чтобы решить проблему, вы должны выяснить, почему некоторые соединения не закрываются после использования.Попытайтесь взглянуть на свой код, чтобы сделать это.
Другой вариант - временно обойтись без C3P0 (пул).Это не навсегда, но, по крайней мере, вы можете проверить, правильно ли это предположение.