Я периодически получаю ошибку: 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(); ... }
|
Может быть, я как-то глобально неправильно делаю коннект к базе? Как тогда правильно?
|