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


Автор: ochnev 22.12.2007, 23:04
Я периодически получаю ошибку:
org.hibernate.exception.JDBCConnectionException: could not execute query

Такое впечатление, что Hibernate теряет коннект к БД. Почему такое может быть?

Вот сам Exception с описанием и причиной:

Цитата

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)
...

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
    at java.net.SocketOutputStream.socketWrite0(Native Method)
...
** END NESTED EXCEPTION **

Last packet sent to the server was 1 ms ago.


Использую Hibernate 3.2, сайт работает под Tomcat 5.5.25, MySQL 5.0.45, ОС Linux, Fedora Core 6.

Конфиг hibernate.cfg.xml:

Код

<hibernate-configuration>
    <session-factory>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql://localhost/courses_fl</property>
        <property name="connection.username">courses</property>
        <property name="connection.password">cspwd</property>
        <property name="connection.pool_size">1</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>

        <mapping resource="..."/>
        ...

    </session-factory>
</hibernate-configuration>


В результате сайт то работает, то не работает (вываливается выше описанная ошибка).
Иногда перезагрузка страницы помогает, иногда нет.
Перезапуск Tomcat на какое-то время помогает (но это не решение).

Что делать, чтобы коннект оставался постоянным?



В догонку.

Коннект к базе делаю так:

В web.xml прописан listener (подкласс ServletContextListener), в нём 

Код

    public void contextInitialized(ServletContextEvent event) {
        ServletContext context = event.getServletContext();

        try {
            sessionFactory = new Configuration().configure().buildSessionFactory();
        } catch(Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }

        context.setAttribute("sf", sessionFactory);
    }


В сервлете (суперклассе для других):

Код

    protected SessionFactory sf;

    public void init() {
        ServletContext context = getServletContext();
        sf = (SessionFactory) context.getAttribute("sf");
        if(sf == null) {
            throw new NullPointerException("Can't get the SessionFactory from ServletContext!");
        }
    }


В подклассах этого сервлета:

Код

    public void doGet(...) ... {
        ...
        Session session = sf.getCurrentSession();
        session.beginTransaction();
        ...
    }


Может быть, я как-то глобально неправильно делаю коннект к базе? Как тогда правильно?

Автор: tux 22.12.2007, 23:13
Ровно та же проблема обсуждалась здесь - http://forum.vingrad.ru/forum/topic-173917/kw-jpa-hibernate-mysql/view-all/hl/mysql/index.html.

Автор: ochnev 23.12.2007, 19:35
Почитал ту тему.

Ещё небольшие вопросы:
C3p0 - это и есть "default connection pooling mechanism" или это другой? (просто он в комплекте с Hibernate, вот и подумалось)
Умеет ли он поддерживать постоянный/обновляемый коннект к БД?

Автор: tux 23.12.2007, 20:03
Цитата(ochnev @  23.12.2007,  19:35 Найти цитируемый пост)
C3p0 - это и есть "default connection pooling mechanism" или это другой?

Нет. У Hibernate есть свой простейший пул соединений.

Цитата(ochnev @  23.12.2007,  19:35 Найти цитируемый пост)
просто он в комплекте с Hibernate, вот и подумалось

С ним в комплекте не только C3P0, но и DBCP.

Цитата(ochnev @  23.12.2007,  19:35 Найти цитируемый пост)
Умеет ли он поддерживать постоянный/обновляемый коннект к БД?

Умеют и C3P0 и DBCP.

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