Przeglądam SO przez jakiś czas i żuję mój kapelusz w procesie, ale nie mogę znaleźć dokładnego dopasowania do mojego problemu.
W skrócie otrzymuję doskonałe śledzenie stosu (org.apache.tomcat.jdbc.pool.ConnectionPool abandon) po 60 sekundach bezczynności, co jest normalnym zachowaniem dla kilku wątków po stronie serwera.
używam połączenia Tomcat JDBC (org.apache.tomcat.jdbc.pool.DataSource) bezpośrednio
Stos śledzenia:WebApp (Tomcat-jdbc) Połączone połączenie zrzucania DB porzuć wyjątek
Oct 29, 2012 8:55:50 PM org.apache.tomcat.jdbc.pool.ConnectionPool abandon WARNING: Connection has been abandoned PooledConnection[[email protected]]:java.lang.Exception at org.apache.tomcat.jdbc.pool.ConnectionPool.getThreadDump(ConnectionPool.java:967) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:721) at org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:579) at org.apache.tomcat.jdbc.pool.ConnectionPool.getConnection(ConnectionPool.java:174) at org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:111) at com.getsom.getConnection(DAO.java:1444) at com.getsom.PreparedConnection.(PreparedConnection.java:48) at com.getsom.Alarms.run(Alarms.java:492)
Moi PoolProperties są skonfigurowane następująco:
PoolProperties pp = new PoolProperties();
pp.setUrl(someValidUrl);
pp.setDriverClassName("com.mysql.jdbc.Driver");
pp.setUsername(someUser);
pp.setPassword(somePassword);
pp.setJmxEnabled(true);
pp.setTestWhileIdle(true);
pp.setTestOnBorrow(true);
pp.setValidationQuery("SELECT 1");
pp.setTestOnReturn(false);
pp.setValidationInterval(30000);
pp.setTimeBetweenEvictionRunsMillis(30000);
pp.setMaxActive(100);
pp.setInitialSize(10);
pp.setMaxWait(10000);
pp.setMinEvictableIdleTimeMillis(30000);
pp.setMinIdle(10);
pp.setLogAbandoned(true);
pp.setRemoveAbandoned(true);
pp.setRemoveAbandonedTimeout(60);
pp.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
"org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
setPoolProperties(pp);
I miałem nadzieję, że setValidationInterval (30000) mnie uratuje, ponieważ 30 to niewiele w cyklu życia połączenia. W każdym razie pytanie brzmi:
Czego mi brakuje, aby utrzymać to połączenie na zawsze? Warto wiedzieć: Dlaczego przekroczono limit czasu funkcji, która odebrała połączenie, mimo że została wywołana 30 sekund wcześniej.
Jeden rok na odpowiedź, dwa lata na akceptację :) – MonoThreaded
Ta odpowiedź jest również moim rozwiązaniem! Dzięki chłopaki! – Samarland