Я запускаю веб-приложение на Tomcat 6, используя Tomcat DBCP для управления соединениями JDBC. Это приложение может работать с MySQL, SQL Server, и мы недавно начали тестирование на Oracle. В отличие от MySQL и SQL Server, когда мы начали использовать тонкий драйвер Oracle, наше приложение начало использовать бесконечную память.
Приложение работает на сервере Windows 2008 и устанавливает Oracle 11g. Tomcat работает как сервис, с максимальной памятью в 2 гигабайта, -XX: MaxPermSize = 1024m и максимальный размер стека потока 1024k. Настройки DBCP имеют максимальный активный уровень 20 и максимальный уровень холостого хода 10. Оставленный для запуска на некоторое время, он займет все 2 гигабайта и начнет отчет:
java.lang.OutOfMemoryError: пространство кучи Java
Наше использование JDBC довольно элементарно. Мы получаем соединение из источника данных JDBC, выполняем наши запросы или обновления и вызываем close () для результата, оператора и соединения (если каждый существует).
При работе с драйвером MySQL 5 или драйвером JTDS мы можем использовать менее 1 гигабайта памяти. Разница лишь в драйвере Oracle.
Что я могу сделать, чтобы остановить это?
Обновление (30 марта 2011 г.): Я добавил комментарии в качестве ответов ниже. Кто-нибудь может помочь?
Вот ответы на комментарии:
База данных не находится на том же сервере, что и Tomcat. Сервер, на котором размещен Tomcat, имеет 8 гигабайт физической памяти.
Я не закрываю соединение после каждого использования. Я использую DBCP Tomcat, и я вызываю close () после каждого использования, но для пула установлено максимальное активное значение 20, максимальное время простоя 10.
Версия тонкого драйвера, которую я использую, - 11.2.0.2.0.
Что касается -Xmx, я запускаю его как службу, с «Начальным пулом памяти» 1024 МБ, «Максимальным пулом памяти» 2048 МБ и «Размером стека потоков» 1024 КБ
У меня нет трассировки стека - ошибки нет до тех пор, пока не закончится ошибка памяти (без трассировки стека).