(पुराना प्रश्न लेकिन मुझे उसी त्रुटि/चेतावनी संदेश का सामना करना पड़ा) क्या आप QueryTimeoutInterceptor
के साथ jdbc पूल का उपयोग करते हैं या statement.setQueryTimeout(320)
. पर कॉल करें समारोह। यह लंबे समय तक चलने वाले प्रश्नों को रद्द करने के लिए एक आंतरिक mysqljdbc.jar थ्रेड को आमंत्रित करता है।
टॉमकैट हॉट परिनियोजन इसे पहचान नहीं पाता है इसलिए थ्रेड पीछे चल रहा है और एक मृत वेबएप संदर्भ अभी भी रैम में रखता है।
<Resource name="jdbc/BSManager" auth="Container"
type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
initialSize="2" maxActive="100" maxIdle="10" maxWait="30000"
username="myuser" password="mypwd"
driverClassName="com.mysql.jdbc.Driver"
jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.QueryTimeoutInterceptor(queryTimeout=320)"
url="jdbc:mysql://127.0.0.1:3306/mydb?useUnicode=true&characterEncoding=utf8"
validationQuery="SELECT 1" removeAbandoned="true" removeAbandonedTimeout="7200"
testOnBorrow="true" maxAge="1800000"
/>
यह चेतावनी संदेश The web application [TI] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it
तब भी होता है जब यह श्रोता tomcat/conf/server.xml
. में सक्रिय होता है फ़ाइल। मुझे नहीं पता कि क्वेरी टाइमआउट के बाद मृत वेबएप जारी किया गया है या नहीं। मैंने MySQL jdbc ड्राइवर के साथ क्वेरी टाइमआउट का उपयोग नहीं करने का निर्णय लिया है।
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"
classesToInitialize="com.mysql.jdbc.NonRegisteringDriver" />