Объект 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