Заблокированные потоки на JDBC4Connection и Log4J
Я столкнулся с проблемой высокой загрузки ЦП с tomcat7. Веб-приложение, разработанное с использованием JDK7, развернуто на сервере Tomcat. Это веб-приложение связывается с сервером MySQL, работающим в другом экземпляре, для функций CRUD.
Загрузка ЦП tomcat становится чрезмерно высокой один раз в неделю. Чтобы проанализировать это, я взял дамп потока и обнаружил, что некоторые заблокированные потоки.
Большинство заблокированных потоков имеют следующую трассировку стека,
ajp-bio-8009-exec-20604 - приоритет:10 - threadId:0x0000000001aac000 - nativeId:0x4143 - состояние:BLOCKED stackTrace: java.lang.Thread.State: BLOCKED (на мониторе объекта) в org.apache.log4j.Category.callAppenders(Category.java:204) - ожидает блокировки <0x000000008bf42fc8> (org.apache.log4j.Logger) в org.apache.log4j.Category.forcedLog(Category.java:391) в org.apache.log4j.Category.log(Category.java:838) в com.myUtil.filter.XSSFilter.doFilter(XSSFilter.java:37) в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) в org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) в org.apache.catalina.core. 123) в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) в орг.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) в org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) в org.apache.catalina.conter.Adyter. Java:407) в org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) в org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) в org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310) - заблокирован <0x00000000db84e148> (org.apache.tomcat.util.net.SocketWrapper) в java.util.concurrent.ThreadPoolExecutor.runWorker) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:744) Заблокированные собственные синхронизаторы: - <0x00000000db84e190> (java.util.conurur.ThreadPoolExecutor$Worker)
И еще одна трассировка стека, связанная с соединением JDBC,
ajp-bio-8009-exec-20585 - приоритет:10 - threadId:0x000000000190f000 - nativeId:0x40d6 - состояние:BLOCKED stackTrace: java.lang.Thread.State: BLOCKED (на мониторе объекта) на com.mysql.jdbc.JDBC4Connection.isValid(JDBC4Connection.java:93) - ожидание блокировки <0x000000008bdf9890> (com.mysql.jdbc.JDBC4Connection) в com.myUtil.dbconnection.DBAccessObject.IsConnected(DBAccessObject.java:751.bb) в com.by.InitOrGetConnection (MyDBHandler.java:119) в com.myUtil.dbhandler.MyDBHandler.GetNotification (MyDBHandler.java:8585) в com.myUtil.util.ProcessRequest.myPost(ProcessRequest.java:mytil.comtil.comtilu. Comtil. Com).ProcessRequest.doPost(ProcessRequest.java:104) в javax.servlet.http.HttpServlet.service(HttpServlet.java:647) в javax.servlet.http.HttpServlet.service(HttpServlet.java:7apache.catg или в).core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:210) в.myUtil.filter.XSSFilter.: 210) в org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) в org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) в org.apache.cat. StandardHostValve.invoke (StandardHostValve.java:171) в org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) в org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.j).apache.catalina.core.StandardEngineValve.invoke (StandardEngineValve.java:118) в org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) в org.apache.coyote.ajp.ProcessPro.java: 200) в org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) в org.ap ache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run (JIoEndpoint.java:310) - заблокирован <0x00000000db7c38f8> (org.apache.tomcat.util.net.SocketWrapper) в java.util.concurrent.ThorkPolor ThreadPoolExecutor.java:1145) в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) в java.lang.Thread.run(Thread.java:744) Заблокированные собственные синхронизаторы: - <0x00000000db740 java.util.concurrent.ThreadPoolExecutor$Worker)
Я проверил состояние сервера MySQL. Но все (количество соединений / потоков) там было нормально.
Это приложение работало нормально в течение последних 4 лет. Только за последние 3 месяца я столкнулся с этой проблемой. И никаких изменений не было внесено в код сервера. Мне приходилось перезагружать сервер каждый раз, когда возникала эта проблема.
Как я могу найти причину этой проблемы и навсегда устранить ее?