2016-07-31 2 views
3

Я использую HikariCP 2.4.7 для пула соединений. Все хорошо только после запуска приложения, но через какое-то время без вызова getConnection() я получаю эту ошибку, когда я пытаюсь getConnection():HikariPool-1 - подключение недоступно, запрос истекает после

java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 42734ms. 
    at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:555) 
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:188) 
    at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:147) 
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:99) 
    at pl.airly.database.ComplexOperations.getSensorDataFromArea(ComplexOperations.java:310) 
    at pl.airly.database.ComplexOperations.getMeasurementsInAreaWithinTimeFrame(ComplexOperations.java:201) 
    at pl.airly.ResponseGenerator.getResponseAdequateToRequest(ResponseGenerator.java:139) 
    at sun.reflect.GeneratedMethodAccessor24.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:87) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:522) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:1110) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:785) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1425) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 

Во время запуска я инициализирующий HikariDataSource:

hikariDataSource = new HikariDataSource(); 
hikariDataSource.setDriverClassName("org.postgresql.Driver"); 
hikariDataSource.setUsername(DATABASE_USER_NAME); 
hikariDataSource.setPassword(DATABASE_PASSWORD); 
hikariDataSource.setJdbcUrl(DATABASE_URL); 
hikariDataSource.setLeakDetectionThreshold(5000); 

И то я использую его вот так:

try(java.sql.Connection conn = Connection.hikariDataSource.getConnection()) { 
      Record1 record1 = DSL.using(conn).select(SENSOR.ID) //jOOQ 
        .from(SENSOR) 
        .where(SENSOR.ID.equal(1)) 
        .limit(1) 
        .fetchOne(); 
      Debug.println(record1.getValue(0).toString()); 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 

Что я делаю неправильно? Как устранить эту проблему?

Edit:

Добавление это решает проблему:

hikariDataSource.setIdleTimeout(60000); 
hikariDataSource.setConnectionTimeout(60000); 
hikariDataSource.setValidationTimeout(3000); 
hikariDataSource.setLoginTimeout(5); 
hikariDataSource.setMaxLifetime(60000); 

Это может быть что-то связано с закрытием сервера соединений, прежде чем HikariCP делает, но я не уверен. Любые комментарии по этому поводу будут оценены.

+1

были у отладить и сузить проблему? – singhsumit

+1

К сожалению, нет, я думаю, это может быть закрытие соединений с сервером до того, как HikariCP делает, однако через некоторое время после возникновения этой проблемы мне было принято решение обрабатывать соединение по-другому. – Defozo

ответ

0

Я начинаю с того, чем я не программист Java, вы можете попытаться закрыть jOOQ DSL также:

try(java.sql.Connection conn = Connection.hikariDataSource.getConnection()) { 
     try (Record1 record1 = DSL.using(conn).select(SENSOR.ID)) { 
       .from(SENSOR) 
       .where(SENSOR.ID.equal(1)) 
       .limit(1) 
       .fetchOne(); 
     Debug.println(record1.getValue(0).toString()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} catch (SQLException e) { 
    e.printStackTrace(); 
} 
Смежные вопросы