powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate c3p0 утечка памяти при работе с mysql
20 сообщений из 20, страница 1 из 1
hibernate c3p0 утечка памяти при работе с mysql
    #33741628
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обращаюсь к страничке 2 раза под профайлером.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
<%
 		 try 
                    {
                    	
                    
                    	
                        Connection conn = Hibernate3Support.currentSession().connection();
                        
                        Statement stmt = conn.createStatement();
                        
                         for  ( int  i =  0 ; i <  1 ; i++)
                        
                            {
                            	
								ResultSet rs = stmt.executeQuery("select * from Rubriks");
								 while  (rs.next())
								{
									String s = rs.getString("RubName");
									
								}
								
								rs.close();
								
								
							 }
                                               
                           stmt.close();
                    }
                 catch  (Exception e)
                    {
                        e.printStackTrace();
                    }
   %>

com.mysql.jdbc.Field 2584 byte 19 instance.

Запускаю gc.

0 instance.

Обращаюсь к страничке.

com.mysql.jdbc.Field 2824 byte 4 instance.

итд. Память не освобождается.

Конфигурация c3p0:

Код: plaintext
1.
2.
<prop key="hibernate.c3p0.min_size"> 0 </prop>
				<prop key="hibernate.c3p0.max_size"> 1 </prop>
				<prop key="hibernate.c3p0.max_statements"> 0 </prop>

Когда заккоменчу эти строчки, hibernate начинает использовать свой пул по умолчанию, с которым утечки не возникает. К сожалению, он не рекомендован для production use.

Общая конфигурация:

Tomcat 5.5
jdk1.4.2
Hibernate3.0
c3p0-0.9.1-pre6.jar
mysql-connector-java-5.0.0
mysql 5.0

WinXpSp2.
JProfiler4


Прокомментируйте пожалуйста. Буду благодарен за любые мысли по этому поводу, так как бъюсь над проблемой не один день.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33743173
usa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я из-за этого отказался от hibernate...
В примерах все отлично над таблицами по 3 записи, а как доходит до реализации хорошей ДБ, тут все почему-то молчат:(
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33743771
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас VM отдано 600 метров на серваке. Они выжыраются инстансами класса com.mysql.jdbc.Field за 4-5 суток.

Потом приходится перезапускать tomcat.
И это примерно при 2000 посетителей в день.

Мне что-то кажется что hibernate здесь не причем, точнее не он один в этом замешан:)
надо копать всю связку: hibernate + pool + mysqldriver.

Как уже постил, родной пул hibernate не приводит к утечке памяти.

Хочу сравнить его исходники с исходниками c3p0. Если не поможет - останется использовать не production от hibernate.

Кстати говоря, наблюдал через MySQL Администратор: все коннекты визуально создаются и закрываются. Пробовал на коротком таймауте maxIdleTime=5 sec.

Это в свою очередь никак не помогает при сборке мусорщиком объектов
com.mysql.jdbc.Field

Надеюсь, что все же получу ответ, от того, кто юзает в production hibernate+mysql. Может у меня у одного такие проблемы...
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33743980
oldkeybo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дает ли какой-нибудь выигрыш хибернетовский маппинг с тегом set и many to many отношением. Другими словами - почему бы не создавать маппинги по системе одна таблица - один hbm файл. Или эти теги предназначены специально для HSQL и в случае с mySQL не имеют смысла.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33743988
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey Turn
com.mysql.jdbc.Field 2584 byte 19 instance.

Запускаю gc.

0 instance.

Обращаюсь к страничке.

com.mysql.jdbc.Field 2824 byte 4 instance.

итд. Память не освобождается.



Я что-то не понял, что Вас смущает. Ну сработала страничка, оказалось 19 невычищенных объектов. Запустили GC - они вычистились. Все правильно.

Утечка - это когда растет количество НЕУДАЛЯЕМЫХ объектов - то есть объектов, на которые есть ссылки из других объектов; в корне этих цепочек ссылок сидят статические объекты. В итоге растет память, которую никак нельзя освободить.

Смотрите в Ваше приложение. Где-нибудь растет какой-нибудь статический Hashtable или что-то в этом роде.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33743990
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
usaЛично я из-за этого отказался от hibernate...
В примерах все отлично над таблицами по 3 записи, а как доходит до реализации хорошей ДБ, тут все почему-то молчат:(

А что, нужно что-то кричать?... Ну вот у меня работают приложения на полусотне таблиц каждое (есть таблицы под 3M записей).
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33744070
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При каждом вызове gc, по данным профайлера число объектов com.mysql.jdbc.Field обнуляется.

Внезависимости от того, был ли вызван gc, память, занятая объектами растет стабильно на N байт, при каждом вызове страницы.

Т.е. после K вызовов, профайлер покажет 19 объектов и N*K байт

Вот это меня и смущает. Это и есть утечка памяти, если я не ошибаюсь.

Упоминание про статический HashTable наводит только на мысль о ThreadLocal
переменной session.

Хотя опять же, заменой на дефолтный пул hibernate проблема решается.

Сегодня попробую погонять этот тест с MSSQL сервером и jtds драйвером.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33744080
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подобная тема уже поднималась в топике

Пул соединений в hibernate

Решения(на форуме) я не увидел, хотя автор, возможно решил проблему.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33744239
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MSSQL2000 + jtdsDriver0.8+c3p0: Весь мусор jtds драйвера нормально собирается.

MySQL5.0 + mysql-connector3.1.12(5.0) + hibernate default pool: утечек нет

MySQL5.0 + mysql-connector3.1.12(5.0) + c3p0: утечка в com.mysql.jdbc.Field

MySQL5.0 + mysql-connector3.1.12(5.0) + dbcp: утечка в com.mysql.jdbc.Field

MySQL5.0 + mysql-connector3.0.16-ga.bin + c3p0: утечка в com.mysql.jdbc.Field

MySQL5.0 + mysql-connector3.0.16-ga.bin + hibernate default pool: утечек нет.

Пул c3p0 и dbcp во всех случаях имел настройки типа:
Код: plaintext
1.
2.
3.
<prop key="hibernate.c3p0.min_size"> 0 </prop>
				<prop key="hibernate.c3p0.max_size"> 2 </prop>
				<prop key="hibernate.c3p0.timeout"> 5 </prop>
				<prop key="hibernate.c3p0.max_statements"> 0 </prop>


Тестовый код:


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
 try {
Session s = sessionFactory.openSession();
                        
                        Connection conn = s.connection();
                        
                        Statement stmt = conn.createStatement();
                        
                                                    	
								ResultSet rs = stmt.executeQuery("select * from Rubriks");
								 while  (rs.next())
								{
									String str = rs.getString("RubName");
									
								}
								
								rs.close();
								rs= null ;
								
							                                               
                           stmt.close();
                           stmt= null ;
                           s.close();
                           
                                               }
                 catch  (Exception e)
                    {
                        e.printStackTrace();
                    }

Резюмируя тесты можно сказать, что стандартные opensource пулы реализованы так, что работают с hibernate + MSSQL- сервером корректно,
а с mysql на всех драйверах дают утечку в классе com.mysql.jdbc.Field

Заявляю это с вероятностью 80% за списанием 20% на кривизну моих рук:)
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33744622
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TurnПодобная тема уже поднималась в топике

Пул соединений в hibernate

Решения(на форуме) я не увидел, хотя автор, возможно решил проблему.

Автор решил проблему. Там автор просто не закрывал итераторы, которые и оставались открытыми : "...Это приводит к тому что когда достигается предел открытых курсоров на сессию, с3р0 начинает ожидать закрытия курсоров..." Решение было простое: закрывать итераторы, как и положено.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33744686
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TurnРезюмируя тесты можно сказать, что стандартные opensource пулы реализованы так, что работают с hibernate + MSSQL- сервером корректно,
а с mysql на всех драйверах дают утечку в классе com.mysql.jdbc.Field

Заявляю это с вероятностью 80% за списанием 20% на кривизну моих рук:)

Вот этот последний код у Вас попроще и попонятнее. Все сделано правильно. Но я никак не пойму, о каких утечках "в классе com.mysql.jdbc.Field" Вы говорите, когда все объекты этого класса при вызове GC благополучно вычищаются (как Вы пишете выше). Вот если бы они продолжали торчать, это была бы утечка.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33744899
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В поле "instances" профайлера все обнуляется после вызова gc, точнее объект com.mysql.jdbc.Field не отображается профайлером. При следующем вызове этого же кода профайлер говорит, что com.mysql.jdbc.Field занимает памяти, как при двух вызовах кода итд...
Факт в том, что память не освобождается. И если вызов кода будет осуществлен 1024 раз, то будет занято 1024*N памяти, которая не будет освобождена.

Нормальная работа: это когда я вызываю код 1000 раз, потом запускаю gc, потом запускаю код и получаю 1900 для объекта, как и при первом обращении, а не 1900*1000.

Я не знаю, почему профайлер не отображает эти объекты после сборки мусора.

Хорошо, пусть это не утечка памяти. Что тогда?
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33744964
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похожая проблема описана здесь
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33747246
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М.Голованов Alexey TurnПодобная тема уже поднималась в топике

Пул соединений в hibernate

Решения(на форуме) я не увидел, хотя автор, возможно решил проблему.

Автор решил проблему. Там автор просто не закрывал итераторы, которые и оставались открытыми : "...Это приводит к тому что когда достигается предел открытых курсоров на сессию, с3р0 начинает ожидать закрытия курсоров..." Решение было простое: закрывать итераторы, как и положено.

Если внимательнее прочитать конец топика:

автор

У меня вот такой код:

List list = query.list();
...

Поэтому Hibernate.close(...) как мне кажется для данного случая не актуален.



Очевидно - здесь нет итераторов. А проблема с открытыми курсорами осталась. Думаю, у меня нечто похожее. Это происходит с отдельными jdbc-drivers в случае автора oracle, в моем - mysqldriver.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33749021
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TurnОчевидно - здесь нет итераторов. А проблема с открытыми курсорами осталась. Думаю, у меня нечто похожее. Это происходит с отдельными jdbc-drivers в случае автора oracle, в моем - mysqldriver.

Здесь нет, а где-нибудь есть... не видя всего кода, судить трудно.

Короче, я бы на вашем месте пересмотрел весь ваш код. На предмет таких простых вещей, как безусловное (в finally) явное закрытие Statement/PreparedStatement, явное закрытие итераторов (если используются) и так далее.

Именно драйверы Oracle (classes12.jar) и MySQL (mysql-connector-java-3.1.12-bin.jar) с c3p0 мне никаких проблем с утечками не доставляют. При соблюдении вышеперечисленных условий.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33749563
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
М.Голованов Alexey TurnОчевидно - здесь нет итераторов. А проблема с открытыми курсорами осталась. Думаю, у меня нечто похожее. Это происходит с отдельными jdbc-drivers в случае автора oracle, в моем - mysqldriver.

Здесь нет, а где-нибудь есть... не видя всего кода, судить трудно.

Короче, я бы на вашем месте пересмотрел весь ваш код. На предмет таких простых вещей, как безусловное (в finally) явное закрытие Statement/PreparedStatement, явное закрытие итераторов (если используются) и так далее.

Именно драйверы Oracle (classes12.jar) и MySQL (mysql-connector-java-3.1.12-bin.jar) с c3p0 мне никаких проблем с утечками не доставляют. При соблюдении вышеперечисленных условий.

Спасибо. Это обнадеживает.
Если не трудно - закиньте пожалуйста jar-ы c3p0 и mysqldrv3.1.12 на
jdev(ШАРИК)ngs.ru
Буду очень благодарен.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33749946
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весь код приложения состоит из двух файлов:

1.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
/*
 * Created on Nov 29, 2005
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
 package  test;

/**
 * @author alexey
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
 import  org.hibernate.*;
 import  org.hibernate.cfg.*;

 public   class  Hibernate3Support {

	 private   static   final  SessionFactory sessionFactory;
	 static  {
		 try  {
			// Create the SessionFactory

			Configuration cfg =  new  Configuration()

					.setProperty("hibernate.connection.driver_class",
							"com.mysql.jdbc.Driver")
					.setProperty(
							"hibernate.connection.url",
							"jdbc:mysql://localhost:3306/test?useUnicode=true&autoReconnect=true&characterEncoding=Cp1251")
					.setProperty("hibernate.connection.username", "test")
					.setProperty("hibernate.connection.password", "test")
					.setProperty("hibernate.c3p0.min_size", "0").setProperty(
							"hibernate.c3p0.max_size", "1").setProperty(
							"hibernate.c3p0.timeout", "5").setProperty(
							"hibernate.dialect",
							"org.hibernate.dialect.MySQLDialect");

			;

			sessionFactory = (SessionFactory) cfg.buildSessionFactory();
		}  catch  (Throwable ex) {

			 throw   new  ExceptionInInitializerError(ex);
		}
	}

	 public   static   final  ThreadLocal session =  new  ThreadLocal();

	 public   static  Session currentSession() {
		Session s = (Session) session.get();
		// Open a new Session, if this Thread has none yet
		 if  (s ==  null ) {
			s = sessionFactory.openSession();
			session.set(s);
		}
		 return  s;
	}

	 public   static   void  closeSession() {
		Session s = (Session) session.get();
		 if  (s !=  null )
			s.close();
		session.set( null );
	}

}

2.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
 /*
 * Created on May 24, 2006
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
 package  test;

 import  java.sql.Connection;
 import  java.sql.ResultSet;
 import  java.sql.SQLException;
 import  java.sql.Statement;
 import  java.util.Iterator;
 import  com.mchange.v2.c3p0.DataSources;

 import  javax.sql.DataSource;

 import  com.mchange.v2.c3p0.C3P0Registry;

/**
 * @author ALEXEY
 * 
 * TODO To change the template for this generated type comment go to Window -
 * Preferences - Java - Code Style - Code Templates
 */
 public   class  LeakTest {

	 static   final  String TABLE_NAME = "rubs";

	 public   static   void  main(String[] args)  throws  SQLException {

		 while  (true) {

			Connection conn = Hibernate3Support.currentSession().connection();

			Statement stmt = conn.createStatement();

			ResultSet rs = stmt.executeQuery("select * from " + TABLE_NAME);

			 while  (rs.next()) {

				String id = rs.getString( 1 );

			}

			rs.close();

			stmt.close();

			Hibernate3Support.closeSession();

		}

	}

}


Сегодня специально сузил область поиска, чтобы не возникало вопросов об ошибках в коде приложения. Осталось 2 файла.
Скачал hibernate3.1.3 и прицепил его библиотеки hibernate.jar и lib/
Прицепил mysql-connector-java3.1.12-bin.jar

Результат тот-же, что описан в топике.

Подскажите, можно ли это запостить, как баг. Если да, то где?

Снимки кучи:

снимок 1
снимок 2
снимок 3

Все снимки(второй и третий точно) сделаны непосредственно после того, как мусор был собран.

В аттаче приложение из двух файлов, которое "течет" с описанным набором библиотек.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33751203
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, в общем, явно висят и поля, и NewProxyResultSet, и NewProxyStatement, и NewProxyConnection - вся компания. Проблема есть. Наша с Вами разница только в том, что, оказывается, все мои системы тихо и спокойно живут с Hibernate 2.1.8 / c3p0 0.9.1. Это большая разница.

Непременно погоняю Ваши тесты у себя и с 2.1.8, и с 3.1.3... в выходные. Только я, извините, JProfiler4 не доверяю и работаю с дампами непосредственно.
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33754526
Alexey Turn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблему решил с помощью бубна.
Поэксперементировал с профайлером и разными версиями opensource библиотек типа c3p0, dom4j,cglib, hibernate, ehcache. При каждом прогоне теста, после замены какой-нибудь из библиотек память вела себя по разному.(С поправкой на доверие к профайлеру). Иногда она росла линейно, иногда ступенчато. Удовлетворился тем, что нашел много сочетаний, для которых количество Instance ов соответствует размеру отъедаемой ими памяти после сборки мусора. Видимо, у меня просто была неудачная конфигурация, или просто в отпуск пора.

В заключение фотки использования кучи:

Heap_telemetry_graph_2.html

Heap_telemetry_graph_3.html

М.Голованов, спасибо за участие в топике. Вы не думали, кстати переходить на более свежие версии hibernate?
...
Рейтинг: 0 / 0
hibernate c3p0 утечка памяти при работе с mysql
    #33755434
М.Голованов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexey TurnМ.Голованов, спасибо за участие в топике. Вы не думали, кстати переходить на более свежие версии hibernate?

А зачем?... работает отлично, все сделано правильно. От добра добра не ищут. Хотя рано или поздно придется.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / hibernate c3p0 утечка памяти при работе с mysql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]