Краткое примечание к вашему коду: не только Connection, но и ResultSet и Statement также должны быть закрыты в блоке finally. Метод, заданный BRPocock, должен работать нормально.
Но это не фактическая причина ваших 10 подключений за запрос! Причина, по которой вы получаете 10 соединений на каждый запрос, заключается в том, что вы установили minIdle равным 10, что означает, что вы заставляете каждый источник данных иметь 10 соединений при его создании. (Попробуйте установить minIdle на 5, и вы увидите, что у вас будет 5 подключений на запрос.)
Проблема в вашем случае заключается в том, что каждый раз, когда вы делаете запрос, вы создаете новый источник данных:
DataSource datasource = (DataSource) envCtx.lookup("jdbc/dbname");
Я не уверен, как именно работает поиск, но, учитывая ваш список процессов из mysql, я довольно уверен, что для каждого запроса вы создаете новый источник данных. Если у вас есть Java-сервлет, то вы должны создать DataSource в методе init () вашего основного сервлета. Оттуда вы можете получить соединения от него.
В моем случае я сделал что-то еще, потому что у меня есть несколько источников данных (несколько баз данных), я использую следующий код для получения моего источника данных:
private DataSource getDataSource(String db, String user, String pass)
{
for(Map.Entry<String, DataSource> entry : datasources.entrySet())
{
DataSource ds = entry.getValue();
if(db.equals(ds.getPoolProperties().getUrl()))
{
return ds;
}
}
System.out.println("NEW DATASOURCE CREATED ON REQUEST: " + db);
DataSource ds = new DataSource(initPoolProperties(db, user, pass));
datasources.put(db, ds);
return ds;
}
Источник данных опирается на метод equals, который не очень быстрый, но да, он работает. Я просто храню глобальный HashMap, содержащий мои источники данных, и если я запрашиваю источник данных, который еще не существует, я создаю новый. Я знаю, что это работает очень хорошо, потому что в журналах я вижу сообщение NEW DATASOURCE CREATED ON REQUEST: dbname
только один раз на базу данных, даже несколько клиентов используют один и тот же источник данных.