У меня была точно такая же проблема. Мне нужно было поддерживать 1 соединение активным для 3 потоков, и в то же время каждый поток должен был выполнять много операторов (порядка 100 КБ). Я был очень осторожен и закрыл каждое утверждение и каждый набор результатов, используя алгоритм try .... finally ... Таким образом, даже если код каким-то образом завершился неудачей, оператор и набор результатов всегда были закрыты. После запуска кода в течение 8 часов я был удивлен, обнаружив, что необходимая память выросла с начальных 35 МБ до 500 МБ. Я создал дамп памяти и проанализировал его с помощью Mat Analyzer из Eclipse. Оказалось, что один объект com.mysql.jdbc.JDBC4Connection занимал 445 МБ памяти для поддержки некоторых объектов openStatements, которые, в свою очередь, поддерживали около 135 тыс. Записей хэш-карт, вероятно, из всех наборов результатов. Таким образом, кажется, что даже если вы закроете все свои операторы и наборы результатов, если вы не закроете соединение, он сохранит ссылки на них, и GarbageCollector не сможет освободить ресурсы.
Мое решение : после долгих поисков я нашел это утверждение от парней из MySQL:
"Быстрый тест - добавить" dontTrackOpenResources = true"к URL-адресу JDBC. Если утечка памяти
уходит, некоторые пути кода в вашем приложении не закрывают операторы и наборы результатов. "
Вот ссылка: http://bugs.mysql.com/bug.php?id=5022. Итак, я попробовал это и угадайте, что? Через 8 часов мне потребовалось около 40 МБ памяти для тех же операций с базой данных.
Может быть, пул соединений был бы целесообразен, но если это не вариант, это следующая лучшая вещь, которую я нашел.