Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > сайт на Hibernate периодически падает


Автор: ochnev 24.3.2008, 12:43
Работает сайт на сервлетах и использованием Hibernate.
Раз в пару дней при открытии любой страницы появляется ошибка, org.hibernate.exception.JDBCConnectionException:

Цитата

org.apache.jasper.JasperException: could not execute query
...

root cause 

org.hibernate.exception.JDBCConnectionException: could not execute query
    org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)
    org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
    org.hibernate.loader.Loader.doList(Loader.java:2223)
    org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
    org.hibernate.loader.Loader.list(Loader.java:2099)
    org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
    org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
    org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
    org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
    org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
    org.hibernate.impl.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:811)
...


Ещё в некоторых случаях появляется такое сообщение (ниже в списке exception'ов):

Цитата

root cause 

com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:


** BEGIN NESTED EXCEPTION ** 

com.mysql.jdbc.CommunicationsException
MESSAGE: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.net.SocketException
MESSAGE: Broken pipe

STACKTRACE:

java.net.SocketException: Broken pipe


Почему постоянно рвётся соединение с базой данных?
Что с этим делать?
Перезапускать Tomcat по cron'у - в принципе можно, но это не дело.

Раньше очень похожая проблема была, понадобилось приделать connection pool, вроде стало работать нормально, но всех проблем это не решило.
Вот фрагмент hibernate.cfg.xml (у меня вообще правильно connection pool настроен?):

Код

        <property name="connection.pool_size">0</property>
        <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

        <property name="current_session_context_class">thread</property>
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        <property name="show_sql">true</property>

        <property name="c3p0.max_size">5</property>
        <property name="c3p0.min_size">1</property>
        <property name="c3p0.timeout">3000</property>
        <property name="c3p0.max_statements">100</property>
        <property name="c3p0.idle_test_period">300</property>
        <property name="c3p0.acquire_increment">2</property>


Возможно, дело не только в конфигах, но и в том, как я вообще использую Hibernate API. Наверное, я тут ещё напишу ещё об этом.

Заранее благодарен за подсказки.

Автор: Llucas 25.3.2008, 16:59
Может по тайм-ауту у тебя заканчивается сессия...

Автор: nogoody 3.6.2008, 13:37
У меня такая же проблема... вроде бы надо ковыряться с настройками пула c3p0... но сам эту проблему не решил.. если найдешь ответ отпишись плиз

Автор: powerOn 3.6.2008, 23:13
не знаю поможет ли, но посмотрите вот эту статью: http://www.hibernate.org/43.html

Автор: koba 12.6.2008, 00:31
Вот решение: http://kobyleha.com/ru/programming/java/java_hibernate_broken_pipe_rus

Автор: ochnev 12.6.2008, 12:30
Цитата(koba @ 12.6.2008,  00:31)
Вот решение: http://kobyleha.com/ru/programming/java/java_hibernate_broken_pipe_rus

Кажись работает.
Сейчас сделал как в рецепте, локально запустил сайт, подождал час, перегрузил страницу, - не упало.

Вот тот волшебный кусок с параметрами, которые я когда-то почему-то не увидел в доках:
Цитата

        <!-- Connection auto reconnect after long inactivity -->
        <property name="connection.autoReconnect">true</property>
        <property name="connection.autoReconnectForPools">true</property>
        <property name="connection.is-connection-validation-required">true</property>


Кто ещё это решение пробовал, - у всех всё нормально?

Автор: ochnev 16.6.2008, 09:51
Только что опять увидел эту ненавистную ошибку.
Сайт после применения предложенного рецепта долго работал нормально, ошибки не возникало, а сейчас опять.

Надёжного решения не существует?

Автор: skhilkov 16.6.2008, 13:15
У меня такая проблема была. Может даже еще пост старый сохранился. Решение мне помогло следующее - перешел на DBCP.

Автор: necromancer 16.6.2008, 14:03
может проблема в волшебных пузырьках?
может стоит увеличить время ожидания соединения в базе? 
или радикально уменьшить время пинга в хибернате?

Автор: ochnev 17.6.2008, 08:36
Цитата(necromancer @ 16.6.2008,  14:03)
может стоит увеличить время ожидания соединения в базе? 

Как это делается в MySQL?
Я сейчас просмотрел my.ini, не нашёл ничего похожего на такую натсройку. Какой параметр туда добавить надо?

Добавлено через 4 минуты и 10 секунд
Цитата(skhilkov @ 16.6.2008,  13:15)
У меня такая проблема была. Может даже еще пост старый сохранился. Решение мне помогло следующее - перешел на DBCP.

Помню, была здесь такая тема, я её читал.
Но ведь Hibernate 3-й не работает с DBCP. Там соответствующий ConnectionProvider (если я правильно помню) в дистрибутов Hibernate не включён, а сторонняя поделка имеет столько глюков, что использование её вообще не рекомендуется.

Автор: necromancer 17.6.2008, 11:21
Цитата(ochnev @  17.6.2008,  08:36 Найти цитируемый пост)
Как это делается в MySQL?Я сейчас просмотрел my.ini, не нашёл ничего похожего на такую натсройку. Какой параметр туда добавить надо?

немножечко погуглив нашел:
http://dev.mysql.com/doc/refman/5.0/en/connector-j-reference-configuration-properties.html

Автор: ochnev 25.6.2008, 09:25
Я стал сильно подозревать, что дело в особенностях конфигурации системы.
Дома я проверил предложенный рецепт, локально под Windows XP всё работает. Ещё на одном сервере под Windows 2003 Server немного попробовал - вроде тоже всё нормально.
А под Linux у меня стоит DirectAdmin (на боевом сервере), и он как-то хитро-сложно вмешивается в работу всей системы. Смутно помню, вроде я не мог остановить mysqld из шелла, а только средствами DirectAdmin. В общем, у меня подозрения, что DirectAdmin что-то делает с mysqld, и тот рвёт соединения и восстанавливать их не хочет.
Думаю, что теперь делать.
Может быть, workaround какой-нибудь сделать, - отлавливать org.hibernate.exception.JDBCConnectionException и программно восстанавливать соединение (осталось разобраться как это сделать)?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)