Java: таймауты в DataSource

Модератор: Модераторы разделов

Ответить
Obscurus
Сообщения: 171

Java: таймауты в DataSource

Сообщение Obscurus »

Понадобилось мне написать веб-приложение на яве с доступом к базе данных. Я в этом деле не силён, поэтому сделал так: создал два класса - InitListener и собственно сервлет ProductsServlet. InitListener вызывается при запуске приложения и получает от сервлет-контейнера заранее сконфигурированное подключение к базе.

Код:

public class InitListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { try { Context initCtx = new InitialContext(); Context envCtx = (Context) initCtx.lookup("java:comp/env"); DataSource ds = (DataSource) envCtx.lookup("jdbc/dbase"); event.getServletContext().setAttribute("ds", ds); } catch (NamingException e) { ...... } }


Сервлет получает объект DataSource, из него уже добывает Connection:

Код:

public class ProductsServlet extends HttpServlet { private DataSource _ds; public void init(ServletConfig config) { _ds = (DataSource) config.getServletContext().getAttribute("ds"); } private Connection _getConnection() { Connection _conn; try { _conn = _ds.getConnection(); } catch (SQLException e) { ..... return null; } return _conn; } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn = _getConnection(); if (conn == null) return; ......... try { conn.close(); } catch (SQLException e) { throw new IOException(e); } } }


С первого взгляда всё работает как надо, никаких накладок не вылезает. Но если на сервере получается долгий простой без запросов (часов 12 и более), в функции doGet() образуется такое вот исключение.
java.io.IOException: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 59 226 977 milliseconds ago.
The last packet sent successfully to the server was 59 227 011 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

Почему истекает таймаут мне не понятно - ведь при каждом вызове doGet() создаётся новое подключение, а после закрывается при помощи close(). Может посоветуете чего?
Спасибо сказали:
Ответить