开发者社区> 问答> 正文

网络抖动时候,获取数据库连接等待15分钟后报错。

我们的服务器和数据库分布在不同的机房,现象就是每隔一小时左右,获取数据库连接就会等待15分钟后报异常,然后继续获取连接,执行SQL正常。服务器用的是druid1.0.17版本。 有没有可以设置连接超时的参数?我找到了一个validationQueryTimeout参数,这个是statement级别的控制,不是Connection级别的控制。

2016-05-31 11:13:00 DEBUG [http-bio-8081-exec-21] org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:110): Fetching JDBC Connection from DataSource

2016-05-31 11:28:30 DEBUG [http-bio-8081-exec-21] com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:96): close statement error java.sql.SQLRecoverableException: Closed Connection at oracle.jdbc.driver.PhysicalConnection.needLine(PhysicalConnection.java:5389) at oracle.jdbc.driver.OracleStatement.closeOrCache(OracleStatement.java:1578) at oracle.jdbc.driver.OracleStatement.close(OracleStatement.java:1563) at oracle.jdbc.driver.OracleStatementWrapper.close(OracleStatementWrapper.java:94) at com.alibaba.druid.filter.FilterChainImpl.statement_close(FilterChainImpl.java:2386) at com.alibaba.druid.filter.stat.StatFilter.statement_close(StatFilter.java:311) at com.alibaba.druid.filter.FilterChainImpl.statement_close(FilterChainImpl.java:2383) at com.alibaba.druid.proxy.jdbc.StatementProxyImpl.close(StatementProxyImpl.java:124) at com.alibaba.druid.util.JdbcUtils.close(JdbcUtils.java:94) at com.alibaba.druid.pool.DruidAbstractDataSource.testConnectionInternal(DruidAbstractDataSource.java:1285) at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:990) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4544) at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:662) at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4540) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:955) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:947) at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:102) at org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource.getConnection(AbstractRoutingDataSource.java:164) at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111) at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77) at org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:82) at org.mybatis.spring.transaction.SpringManagedTransaction.getConnection(SpringManagedTransaction.java:68) at org.apache.ibatis.executor.BaseExecutor.getConnection(BaseExecutor.java:315) at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:75) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:61) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:303) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:154) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:102) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:82) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:120) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:113) at sun.reflect.GeneratedMethodAccessor45.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:386) at com.sun.proxy.$Proxy23.selectList(Unknown Source) at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:205) at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:122) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:64) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:53) at com.sun.proxy.$Proxy38.QueryBargNoByCustid(Unknown Source) at sun.reflect.GeneratedMethodAccessor58.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:302) at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) at com.homelink.dao.datasource.multi.SQLExecuterInterceptor.executeSZSQL(SQLExecuterInterceptor.java:57) at sun.reflect.GeneratedMethodAccessor35.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:621) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:610) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208) at com.sun.proxy.$Proxy39.QueryBargNoByCustid(Unknown Source) at com.homelink.service.portal.impl.AgreementQueryServiceImpl.QueryBargNoByCustid(AgreementQueryServiceImpl.java:61) at com.homelink.controller.app.QueryFkAndDjSketchController.businesslogic(QueryFkAndDjSketchController.java:114) at com.homelink.controller.app.QueryFkAndDjSketchController.protocoldescription(QueryFkAndDjSketchController.java:91) at sun.reflect.GeneratedMethodAccessor75.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:178) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:444) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:432) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:969) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:871) at javax.servlet.http.HttpServlet.service(HttpServlet.java:646) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:845) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at com.homelink.filter.UserOnlineFilter.doFilter(UserOnlineFilter.java:101) at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:314) 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)

吐槽下:druid测试链接的testOnBorrow、testWhileIdle只是拿到连接时候测试,如果这时候Connection(物理网络)不稳定,光测试这一下就耗时很久。 希望testWhileIdle是在守护线程上来做。

原提问者GitHub用户zpa3x60

展开
收起
山海行 2023-07-05 21:51:11 435 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    当网络抖动或者数据库连接池中连接资源不足时,获取数据库连接可能会出现长时间的等待。在一些情况下,连接等待时间可能会超过连接池设置的最大等待时间,从而导致获取数据库连接失败,抛出异常。

    在连接等待时间较长的情况下,可以通过以下方法进行排查和解决:

    检查连接池配置:首先需要检查连接池的配置,确保连接池设置的最大连接数、最大等待时间等参数是否合理。如果连接池设置的最大等待时间较短,可以考虑适当增加最大等待时间。

    检查数据库服务器资源:如果连接池中的连接资源不足,可能是因为数据库服务器资源不足导致的。可以检查数据库服务器的资源使用情况,例如CPU、内存、磁盘等,是否达到了瓶颈。如果服务器资源不足,可以考虑升级服务器配置或者优化数据库性能。

    检查网络连接稳定性:长时间的连接等待可能是由于网络抖动导致的。可以检查网络连接的稳定性,例如是否存在丢包、延迟等问题。如果存在网络问题,可以考虑优化网络连接或者更换网络环境。

    使用连接池的超时机制:一些连接池框架提供了超时机制,可以在连接等待时间超过一定阈值时自动放弃等待并抛出异常。可以考虑使用这种超时机制,避免出现长时间的连接等待。

    调整应用程序逻辑:如果连接等待时间过长仍无法解决,可以考虑调整应用程序逻辑,例如使用异步编程模型或者优化数据库访问的方式,避免长时间的连接等待。

    2023-07-30 09:39:13
    赞同 展开评论 打赏
  • 值得去的地方都没有捷径

    根据您提供的日志信息,问题可能出在连接池中的连接超时设置上。您所提到的validationQueryTimeout参数确实是用于控制验证查询的超时时间,它是一个语句级别的控制,而不是连接级别的控制。

    要设置连接超时的参数,您可以参考Druid连接池的配置文件或代码,查找与连接超时相关的参数。在Druid连接池中,可以设置maxWait参数来控制连接池获取连接时的最大等待时间。您可以尝试将该参数设置为一个合适的值(例如30秒或1分钟),以避免长时间等待获取数据库连接。

    另外,您还可以检查数据库服务器的相关配置,确保数据库连接数、线程数等参数适当设置,以及网络连接是否稳定。

    如果通过调整参数后问题仍然存在,建议您联系Druid连接池的开发者或社区寻求进一步的技术支持和建议。

    2023-07-11 16:51:02
    赞同 展开评论 打赏
  • 解决办法就是在url上设置socketTimeout。 “jdbc:mysql://xxxx:3306/test?socketTimeout=3000”。 原因:如果配置testWhileIdle=true时,druid每次从连接池获取到连接后都要进行一个有效性验证。这个连接如果中断(防火墙杀死),框架在执行时就是进行TCP重传,linux系统默认重传是15次,耗时大约15分钟。

    原回答者GitHub用户heartarea

    2023-07-06 12:29:35
    赞同 展开评论 打赏
  • 根据您提供的日志信息,您在使用Druid连接池获取数据库连接时遇到了等待15分钟后报错的问题。这种情况通常是由于网络抖动或连接超时引起的。

    在Druid连接池中,可以通过配置一些参数来控制连接超时。其中,validationQueryTimeout是一个控制语句级别超时的参数,并不是用来控制连接级别超时的。对于连接级别的超时控制,Druid连接池提供了maxWait参数,可以设置等待连接的最大时间。

    您可以尝试在Druid连接池的配置中添加以下参数来控制连接超时:

    maxWait=10000
    

    上述配置会将等待连接的最大时间设置为10秒。您可以根据实际情况调整这个值,以适应您的应用程序需求。

    另外,您也可以检查数据库服务器的配置,看是否设置了连接超时时间。如果数据库服务器设置了较短的连接超时时间,那么即使Druid连接池的等待时间较长,也可能在超时之前被数据库服务器断开连接。

    您可以尝试调整Druid连接池的maxWait参数,并检查数据库服务器的连接超时配置,以解决连接等待时间过长的问题。

    2023-07-06 11:00:43
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Session:更加安全、可靠的数据中心网络产品更新 立即下载
Session:极简易用的全球化网络产品更新 立即下载
Session:弹性、高可用、可观测的应用交付网络产品更新 立即下载