Объект DBCP создан... по следующему коду никогда не был закрыт

У нас проблемы с не закрытыми подключениями к БД в нашем приложении. Я пытался все, поэтому я начал экспериментировать с DBCP.

Вот шаги, чтобы воспроизвести проблему:

1) Я установил на Windows:

  • чистый apache-tomcat-7.0.59
  • Java 1.7.0_75

2) Я изменил server.xml, я добавил один ресурс, указывающий на нашу БД

<Resource auth="Container" 
defaultTransactionIsolation="READ_COMMITTED" 
driverClassName="oracle.jdbc.OracleDriver" 
maxActive="20" 
initialSize="2" 
maxIdle="10" 
minIdle="2" 
maxWait="10000" 
timeBetweenEvictionRunsMillis="60000" 
minEvictableIdleTimeMillis="60000" 
testOnBorrow="true" 
validationInterval="30000"
removeAbandoned="true" 
removeAbandonedTimeout="60"
logAbandoned="true"
name="docpilotDB" 
password="xxx" 
type="javax.sql.DataSource" 
url="jdbc:oracle:thin:@1.1.1.1:1521:xe" 
username="zzz" 
validationQuery="SELECT 1 FROM DUAL"/>

3) Я добавил ojdbc6_g.jar в каталог tomcat/lib

4) Затем я создал и развернул приложение с

<Context path="/drm">
  <ResourceLink global="docpilotDB" name="jdbc/docpilotDB" type="javax.sql.DataSource"/>
</Context>

и с одним тестовым сервлетом

<servlet>
    <servlet-name>Initial Service</servlet-name>
    <servlet-class>net.docucom.csas.oms.drm_x.srvlt.InitialService</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

И класс сервлетов

public class InitialService extends GenericServlet {

    private static final Logger log = LoggerFactory.getLogger(InitialService.class);

    private DataSource ds;

    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        try {
            ds = getDataSource();
            run();
        } catch (Exception e) {
            throw new ServletException(e);
        }
    }

    private DataSource getDataSource() throws SQLException {
        try {
            InitialContext ic = new InitialContext();
            DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/docpilotDB");
            return ds;
        } catch (NamingException e) {
            throw new RuntimeException("Unable to get DataSource", e);
        }
    }

    public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
    }

    private synchronized void run() throws Exception {
        log.info("InitialService: start");
        for (int i = 0; i < 100; i++) {
            log.info("InitialService: counter=" + i);
            Thread.sleep(100);
            doSelect();
        }
        log.info("InitialService: end");
    }

    synchronized public Connection connect() throws Exception {
        int result = -1;
        log.debug("connect(): start");

        Connection con = null;

        try {
            con = ds.getConnection();
            log.debug("connect(): got connection " + con.getClass().getName());
            log.debug("connect(): " + DriverManager.getDriver(ds.getConnection().getMetaData().getURL()).getClass());
            result = 0;
        } catch (Throwable e) {
            log.error("connect() Error!", e);
            con = null;
            return con;
        }
        log.debug("connect(): result=" + result);
        return con;
    }

    synchronized public int close(Connection con) throws Exception {
        int result = -1;
        log.debug("close(): start");

        if (con != null) {
            log.debug("con.close();");
            con.close();
            log.debug("con.isClosed=" + con.isClosed());
            con = null;
        }
        result = 0;
        log.debug("close(): result=" + result);
        return result;
    }

    public synchronized void doSelect() throws Exception {
        log.debug("doSelect(): start");
        Connection con  = null;
        //ResultSet res = null;
        try{
            con = connect();

            // if (stmt == null) {
            // stmt = con.createStatement();
            // }
            //
            // res = this.stmt.executeQuery("SELECT * FROM [DRM_OMS].[dbo].[Vat]");
            // while (res.next()) {
            // String Id = res.getString("id");
            // String DPH = res.getString("DPH");
            //
            // }
            //
            // res.close();
            // res = null;
        } finally {
            if (con != null){
                close(con);
            }
        }

        log.debug("doSelect(): end");

    }

}

На сервере Tomcat нет других настроек.

Бревно выглядит приятно притиркой до 20.терации

11:12:58.850  INFO   InitialService: start
11:12:58.856  INFO   InitialService: counter=0
11:12:58.957 DEBUG   doSelect(): start
11:12:58.957 DEBUG   connect(): start
11:12:59.056 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:12:59.079 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:12:59.079 DEBUG   connect(): result=0
11:12:59.079 DEBUG   close(): start
11:12:59.079 DEBUG   con.close();
11:12:59.079 DEBUG   con.isClosed=true
11:12:59.079 DEBUG   close(): result=0
11:12:59.080 DEBUG   doSelect(): end
11:12:59.080  INFO   InitialService: counter=1
11:12:59.180 DEBUG   doSelect(): start
11:12:59.180 DEBUG   connect(): start
11:12:59.205 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:12:59.761 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:12:59.761 DEBUG   connect(): result=0
11:12:59.762 DEBUG   close(): start
11:12:59.762 DEBUG   con.close();
11:12:59.762 DEBUG   con.isClosed=true
11:12:59.762 DEBUG   close(): result=0
11:12:59.762 DEBUG   doSelect(): end
11:12:59.762  INFO   InitialService: counter=2
11:12:59.863 DEBUG   doSelect(): start
11:12:59.863 DEBUG   connect(): start
11:12:59.884 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:00.524 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:00.524 DEBUG   connect(): result=0
11:13:00.524 DEBUG   close(): start
11:13:00.524 DEBUG   con.close();
11:13:00.524 DEBUG   con.isClosed=true
11:13:00.524 DEBUG   close(): result=0
11:13:00.524 DEBUG   doSelect(): end
11:13:00.524  INFO   InitialService: counter=3
11:13:00.624 DEBUG   doSelect(): start
11:13:00.624 DEBUG   connect(): start
11:13:00.679 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:01.315 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:01.315 DEBUG   connect(): result=0
11:13:01.315 DEBUG   close(): start
11:13:01.316 DEBUG   con.close();
11:13:01.316 DEBUG   con.isClosed=true
11:13:01.316 DEBUG   close(): result=0
11:13:01.316 DEBUG   doSelect(): end
11:13:01.316  INFO   InitialService: counter=4
11:13:01.416 DEBUG   doSelect(): start
11:13:01.416 DEBUG   connect(): start
11:13:01.462 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:02.146 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:02.146 DEBUG   connect(): result=0
11:13:02.146 DEBUG   close(): start
11:13:02.146 DEBUG   con.close();
11:13:02.146 DEBUG   con.isClosed=true
11:13:02.146 DEBUG   close(): result=0
11:13:02.146 DEBUG   doSelect(): end
11:13:02.147  INFO   InitialService: counter=5
11:13:02.247 DEBUG   doSelect(): start
11:13:02.247 DEBUG   connect(): start
11:13:02.289 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:02.984 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:02.984 DEBUG   connect(): result=0
11:13:02.984 DEBUG   close(): start
11:13:02.984 DEBUG   con.close();
11:13:02.984 DEBUG   con.isClosed=true
11:13:02.984 DEBUG   close(): result=0
11:13:02.984 DEBUG   doSelect(): end
11:13:02.984  INFO   InitialService: counter=6
11:13:03.084 DEBUG   doSelect(): start
11:13:03.084 DEBUG   connect(): start
11:13:03.118 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:03.447 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:03.447 DEBUG   connect(): result=0
11:13:03.447 DEBUG   close(): start
11:13:03.447 DEBUG   con.close();
11:13:03.447 DEBUG   con.isClosed=true
11:13:03.447 DEBUG   close(): result=0
11:13:03.447 DEBUG   doSelect(): end
11:13:03.447  INFO   InitialService: counter=7
11:13:03.547 DEBUG   doSelect(): start
11:13:03.547 DEBUG   connect(): start
11:13:03.566 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:03.804 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:03.804 DEBUG   connect(): result=0
11:13:03.804 DEBUG   close(): start
11:13:03.804 DEBUG   con.close();
11:13:03.804 DEBUG   con.isClosed=true
11:13:03.804 DEBUG   close(): result=0
11:13:03.805 DEBUG   doSelect(): end
11:13:03.805  INFO   InitialService: counter=8
11:13:03.906 DEBUG   doSelect(): start
11:13:03.906 DEBUG   connect(): start
11:13:03.927 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:04.163 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:04.164 DEBUG   connect(): result=0
11:13:04.164 DEBUG   close(): start
11:13:04.164 DEBUG   con.close();
11:13:04.164 DEBUG   con.isClosed=true
11:13:04.164 DEBUG   close(): result=0
11:13:04.164 DEBUG   doSelect(): end
11:13:04.164  INFO   InitialService: counter=9
11:13:04.265 DEBUG   doSelect(): start
11:13:04.265 DEBUG   connect(): start
11:13:04.282 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:04.517 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:04.518 DEBUG   connect(): result=0
11:13:04.518 DEBUG   close(): start
11:13:04.518 DEBUG   con.close();
11:13:04.518 DEBUG   con.isClosed=true
11:13:04.518 DEBUG   close(): result=0
11:13:04.518 DEBUG   doSelect(): end
11:13:04.518  INFO   InitialService: counter=10
11:13:04.618 DEBUG   doSelect(): start
11:13:04.618 DEBUG   connect(): start
11:13:04.643 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:04.876 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:04.876 DEBUG   connect(): result=0
11:13:04.876 DEBUG   close(): start
11:13:04.876 DEBUG   con.close();
11:13:04.876 DEBUG   con.isClosed=true
11:13:04.876 DEBUG   close(): result=0
11:13:04.876 DEBUG   doSelect(): end
11:13:04.876  INFO   InitialService: counter=11
11:13:04.977 DEBUG   doSelect(): start
11:13:04.977 DEBUG   connect(): start
11:13:04.993 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:05.246 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:05.246 DEBUG   connect(): result=0
11:13:05.247 DEBUG   close(): start
11:13:05.247 DEBUG   con.close();
11:13:05.247 DEBUG   con.isClosed=true
11:13:05.247 DEBUG   close(): result=0
11:13:05.247 DEBUG   doSelect(): end
11:13:05.247  INFO   InitialService: counter=12
11:13:05.348 DEBUG   doSelect(): start
11:13:05.348 DEBUG   connect(): start
11:13:05.371 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:05.639 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:05.639 DEBUG   connect(): result=0
11:13:05.640 DEBUG   close(): start
11:13:05.640 DEBUG   con.close();
11:13:05.640 DEBUG   con.isClosed=true
11:13:05.640 DEBUG   close(): result=0
11:13:05.640 DEBUG   doSelect(): end
11:13:05.640  INFO   InitialService: counter=13
11:13:05.740 DEBUG   doSelect(): start
11:13:05.740 DEBUG   connect(): start
11:13:05.760 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:06.002 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:06.003 DEBUG   connect(): result=0
11:13:06.003 DEBUG   close(): start
11:13:06.003 DEBUG   con.close();
11:13:06.003 DEBUG   con.isClosed=true
11:13:06.003 DEBUG   close(): result=0
11:13:06.003 DEBUG   doSelect(): end
11:13:06.003  INFO   InitialService: counter=14
11:13:06.105 DEBUG   doSelect(): start
11:13:06.105 DEBUG   connect(): start
11:13:06.121 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:06.348 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:06.348 DEBUG   connect(): result=0
11:13:06.348 DEBUG   close(): start
11:13:06.348 DEBUG   con.close();
11:13:06.348 DEBUG   con.isClosed=true
11:13:06.348 DEBUG   close(): result=0
11:13:06.348 DEBUG   doSelect(): end
11:13:06.348  INFO   InitialService: counter=15
11:13:06.448 DEBUG   doSelect(): start
11:13:06.448 DEBUG   connect(): start
11:13:06.467 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:06.747 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:06.747 DEBUG   connect(): result=0
11:13:06.747 DEBUG   close(): start
11:13:06.747 DEBUG   con.close();
11:13:06.747 DEBUG   con.isClosed=true
11:13:06.747 DEBUG   close(): result=0
11:13:06.747 DEBUG   doSelect(): end
11:13:06.747  INFO   InitialService: counter=16
11:13:06.848 DEBUG   doSelect(): start
11:13:06.848 DEBUG   connect(): start
11:13:06.862 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:07.112 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:07.112 DEBUG   connect(): result=0
11:13:07.112 DEBUG   close(): start
11:13:07.112 DEBUG   con.close();
11:13:07.112 DEBUG   con.isClosed=true
11:13:07.112 DEBUG   close(): result=0
11:13:07.112 DEBUG   doSelect(): end
11:13:07.112  INFO   InitialService: counter=17
11:13:07.214 DEBUG   doSelect(): start
11:13:07.214 DEBUG   connect(): start
11:13:07.233 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:07.477 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:07.479 DEBUG   connect(): result=0
11:13:07.479 DEBUG   close(): start
11:13:07.479 DEBUG   con.close();
11:13:07.479 DEBUG   con.isClosed=true
11:13:07.479 DEBUG   close(): result=0
11:13:07.480 DEBUG   doSelect(): end
11:13:07.480  INFO   InitialService: counter=18
11:13:07.580 DEBUG   doSelect(): start
11:13:07.580 DEBUG   connect(): start
11:13:07.603 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:07.866 DEBUG   connect(): class oracle.jdbc.OracleDriver
11:13:07.867 DEBUG   connect(): result=0
11:13:07.867 DEBUG   close(): start
11:13:07.867 DEBUG   con.close();
11:13:07.867 DEBUG   con.isClosed=true
11:13:07.867 DEBUG   close(): result=0
11:13:07.867 DEBUG   doSelect(): end
11:13:07.867  INFO   InitialService: counter=19
11:13:07.968 DEBUG   doSelect(): start
11:13:07.968 DEBUG   connect(): start
11:13:07.991 DEBUG   connect(): got connection org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
11:13:18.001 ERROR   connect() Error!
java.util.NoSuchElementException: Timeout waiting for idle object
    at org.apache.tomcat.dbcp.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1171) ~[tomcat-dbcp.jar:7.0.59]
    at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:79) ~[tomcat-dbcp.jar:7.0.59]
    at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) ~[tomcat-dbcp.jar:7.0.59]
    ... 21 common frames omitted
Wrapped by: org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object
    at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:114) ~[tomcat-dbcp.jar:7.0.59]
    at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) ~[tomcat-dbcp.jar:7.0.59]
    at net.docucom.csas.oms.drm_x.srvlt.InitialService.connect(InitialService.java:68) [InitialService.class:na]
    at net.docucom.csas.oms.drm_x.srvlt.InitialService.doSelect(InitialService.java:99) [InitialService.class:na]
    at net.docucom.csas.oms.drm_x.srvlt.InitialService.run(InitialService.java:54) [InitialService.class:na]
    at net.docucom.csas.oms.drm_x.srvlt.InitialService.init(InitialService.java:30) [InitialService.class:na]
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5262) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5550) [catalina.jar:7.0.59]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [catalina.jar:7.0.59]
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901) [catalina.jar:7.0.59]
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877) [catalina.jar:7.0.59]
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649) [catalina.jar:7.0.59]
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1081) [catalina.jar:7.0.59]
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1877) [catalina.jar:7.0.59]
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [na:1.7.0_75]
    at java.util.concurrent.FutureTask.run(FutureTask.java:262) [na:1.7.0_75]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_75]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_75]
    at java.lang.Thread.run(Thread.java:745) [na:1.7.0_75]
11:13:18.001 DEBUG   doSelect(): end
11:13:18.001  INFO   InitialService: counter=20
11:13:18.102 DEBUG   doSelect(): start
11:13:18.102 DEBUG   connect(): start

и после истечения времени ожидания консоль tomcat заполнена сообщениями о том, что DBCP не закрыт.

    org.apache.tomcat.dbcp.dbcp.AbandonedTrace$AbandonedObjectException: DBCP object created 2016-02-05 11:12:59 by the following code was never closed:
        at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.setStackTrace(AbandonedTrace.java:139)
        at org.apache.tomcat.dbcp.dbcp.AbandonedObjectPool.borrowObject(AbandonedObjectPool.java:81)
        at org.apache.tomcat.dbcp.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
        at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
        at net.docucom.csas.oms.drm_x.srvlt.InitialService.connect(InitialService.java:68)
        at net.docucom.csas.oms.drm_x.srvlt.InitialService.doSelect(InitialService.java:99)
        at net.docucom.csas.oms.drm_x.srvlt.InitialService.run(InitialService.java:54)
        at net.docucom.csas.oms.drm_x.srvlt.InitialService.init(InitialService.java:30)
        at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1284)
        at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1197)
        at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
        at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5262)
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5550)
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:649)
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1081)
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1877)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
        at java.util.concurrent.FutureTask.run(FutureTask.java:262)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:745)
org.apache.tomcat.dbcp.dbcp.AbandonedTrace$AbandonedObjectException: DBCP object created 2016-02-05 11:12:59 by the following code was never closed:
        at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.init(AbandonedTrace.java:90)
        at org.apache.tomcat.dbcp.dbcp.AbandonedTrace.<init>(AbandonedTrace.java:73)
        at org.apache.tomcat.dbcp.dbcp.DelegatingDatabaseMetaData.<init>(DelegatingDatabaseMetaData.java:52)
        at org.apache.tomcat.dbcp.dbcp.DelegatingConnection.getMetaData(DelegatingConnection.java:345)
...................

Может ли кто-нибудь помочь с этим вопросом? Логики сейчас нет, я борюсь только с DBCP и соединениями через DataSource. Я почти уверен, что закрываю связи. Это ясно в коде Java.

Почему соединения не закрыты? Пожалуйста помоги!

С уважением и спасибо за ваше время и помощь.

Мартин М.

2 ответа

Ведение журнала получает дополнительное соединение каждый раз через цикл:

        log.debug("connect(): " + DriverManager.getDriver(ds.getConnection().getMetaData().getURL()).getClass());

Каждый раз, когда он запускается, он получает соединение из источника данных. После 20 итераций в пуле подключений 20 подключений "используются". поскольку maxActive=20 DataSource не может создать другое соединение. Следовательно, следующий вызов завершается ошибкой в ​​ожидании закрытия одного из 20 неиспользуемых / незамкнутых соединений.

Более поздние исключения жалуются на те соединения, которые никогда не закрывались.

Строка регистрации должна использовать уже восстановленное соединение.

        log.debug("connect(): " + DriverManager.getDriver(con.getMetaData().getURL()).getClass());

Вы получили что-нибудь с этим? У меня есть свои проблемы с DBCP2. Я пытаюсь перейти из среды J2EE в пакетную среду Java, поэтому я заменяю источники данных контейнера на DBCP2 в Spring и DB2 под прикрытием

Я почти уверен, что я также закрываю свои соединения, и я не получаю сообщение об ошибке "Соединение не закрыто", которое вы описали здесь, но через некоторое время получаю тайм-аут и могу видеть через netstat в окне сервера приложений, что сервер сохраняет подключения к серверу БД, и, кажется, увеличивается, пока приложение не завершит работу.

Если я устанавливаю maxActive=-1, я не получаю тайм-аут, но, конечно, соединения продолжают увеличиваться, и в конечном итоге сервер выдает ошибки из-за того, что у него слишком много открытых файлов (это RHEL).

Я поместил множество локальных журналов потоков вокруг управления соединениями, чтобы определить, где в каком-либо вызове может отсутствовать закрывающий вызов, поскольку база кода составляет 250 КБ + строк кода в 30 проектах, и почти невозможно проверить все это.

Любое понимание приветствуется. Интересно, стоит ли попробовать c3p0

Другие вопросы по тегам