开发者社区> 问答> 正文

连接池运行10多天就会被占满

问题描述: 应用长时间不重启的吧,每天都会增加几个活动连接,直接到活动连接达到最大值,应用开始报错,提示不能获取连接,在活动连接到达最大值时,从oracle看,并没有活动回话.导出应用线程栈可以看到30个线程都在进行db操作,结合日志,有些线程居然跑了20多天,所有操作db的线程都卡在 FileDispatcherImpl.read0 位置.

druid版本:1.1.23

druid配置: spring.datasource.url=jdbc:oracle:thin:@****:**/db spring.datasource.username= spring.datasource.password= spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.druid.initial-size=5 spring.datasource.druid.min-idle=5 spring.datasource.druid.max-active=30 spring.datasource.druid.max-wait=60000 spring.datasource.druid.time-between-eviction-runs-millis=60000 spring.datasource.druid.min-evictable-idle-time-millis=300000 spring.datasource.druid.validation-query=SELECT 1 FROM DUAL spring.datasource.druid.test-while-idle=true spring.datasource.druid.test-on-borrow=true spring.datasource.druid.test-on-return=false spring.datasource.druid.pool-prepared-statements=true spring.datasource.druid.max-pool-prepared-statement-per-connection-size=30 spring.datasource.druid.use-unfair-lock=true spring.datasource.druid.remove-abandoned=true spring.datasource.druid.remove-abandoned-timeout=1800 spring.datasource.druid.log-abandoned=false spring.datasource.druid.validation-query-timeout=1 spring.datasource.druid.keep-alive=true

线程栈信息:

"http-nio-8157-exec-4180" #84683 daemon prio=5 os_prio=0 tid=0x00007fa480044000 nid=0x12e9 runnable [0x00007fa41684c000] java.lang.Thread.State: RUNNABLE at sun.nio.ch.FileDispatcherImpl.read0(Native Method) at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39) at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223) at sun.nio.ch.IOUtil.read(IOUtil.java:197) at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:378)

locked <0x00000007284ff458> (a java.lang.Object) at oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:174) at oracle.net.ns.NSProtocolNIO.doSocketRead(NSProtocolNIO.java:555) at oracle.net.ns.NIOPacket.readHeader(NIOPacket.java:258) at oracle.net.ns.NIOPacket.readPacketFromSocketChannel(NIOPacket.java:190) at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:132) at oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:105) at oracle.net.ns.NIONSDataChannel.readDataFromSocketChannel(NIONSDataChannel.java:91) at oracle.jdbc.driver.T4CMAREngineNIO.prepareForUnmarshall(T4CMAREngineNIO.java:764) at oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:429) at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:407) at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:268) at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:655) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:270) at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:91) at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:807) at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:983) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1168) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3666) at oracle.jdbc.driver.T4CPreparedStatement.executeInternal(T4CPreparedStatement.java:1426) at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3778) locked <0x0000000721f24ce0> (a oracle.jdbc.driver.T4CConnection) at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1081) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3461) at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3459) at com.alibaba.druid.wall.WallFilter.preparedStatement_execute(WallFilter.java:626) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3459) at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440) at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3459) at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:167) at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:497) ....

原提问者GitHub用户gnixkuang

展开
收起
山海行 2023-07-05 17:59:56 354 0
4 条回答
写回答
取消 提交回答
  • 北京阿里云ACE会长

    如果您的连接池运行 10 多天就会被占满,可能有以下几种原因:

    连接泄漏
    连接泄漏是最常见的连接池问题之一,它会导致连接池中的连接不断增加,最终占满整个连接池。连接泄漏的原因通常是应用程序没有正确地关闭连接,或者在连接池中使用了长时间的连接。

    为了避免连接泄漏,应该在应用程序中始终正确地关闭连接,并使用连接池提供的空闲连接回收机制,以避免长时间占用连接。

    连接池配置不合理
    连接池配置不合理也可能导致连接池被占满。例如,如果连接池中的最大连接数设置得过小,那么连接池很容易被占满。另外,如果连接池中的最小连接数设置得过高,那么连接池中可能存在大量空闲连接,从而占用过多的系统资源。

    为了避免连接池配置不合理,应该根据实际情况调整连接池的最大连接数和最小连接数等参数,以确保连接池的性能和可用性。

    数据库连接资源不足
    如果数据库连接资源不足,那么连接池也很容易被占满。例如,数据库连接池所在的数据库服务器资源不足,或者数据库连接池与数据库服务器之间的网络带宽不足等。

    2023-07-30 21:04:15
    赞同 展开评论 打赏
  • 这个问题看起来是由于您的应用长时间不重启,导致活动连接数达到了最大值,从而导致应用无法获取连接,从而导致应用报错。这个问题可能是由于您的应用在长时间运行的过程中,有些线程一直在进行db操作,导致活动连接数达到了最大值。
    为了解决这个问题,您可以考虑使用Druid的连接池来管理数据库连接。Druid的连接池可以自动管理数据库连接,避免因为连接数达到最大值而导致应用无法获取连接的问题。您可以使用Druid的连接池来管理数据库连接,然后在应用中使用Druid的连接池来进行数据库操作。这样,应用就不会因为连接数达到最大值而导致无法获取连接了。

    2023-07-09 10:19:31
    赞同 展开评论 打赏
  • 请使用最新版本

    原回答者GitHub用户kimmking

    2023-07-06 10:38:11
    赞同 展开评论 打赏
  • 根据提供的线程栈信息,可以看到有大量线程在执行数据库操作,并且在 FileDispatcherImpl.read0 处发生阻塞。这种情况可能是由于数据库连接池达到最大连接数而导致的问题。

    你的数据库连接池配置中设置了最大活动连接数为 30:

    spring.datasource.druid.max-active=30
    

    然而,从线程栈信息中可以看到有多个线程卡在数据库读取操作上,这表明你的应用程序达到了最大连接数并无法获取新的连接。这可能导致其他线程一直等待可用的数据库连接,进而导致应用程序报错并无法执行数据库操作。

    为了解决这个问题,你可以考虑以下几个方案:

    1. 增加最大连接数: 根据你的应用需求和系统资源,适当增加数据库连接池的最大连接数。例如,将 max-active 参数的值调整为更高的数值,以便满足业务需求。

    2. 优化数据库操作: 检查应用程序的数据库操作是否存在性能瓶颈。通过优化 SQL 查询、合理使用数据库索引、避免不必要的查询等方式,减少对数据库的频繁访问,从而降低数据库连接的使用量。

    3. 检查数据库连接泄漏: 确保应用程序中没有发生数据库连接泄漏的情况。即使配置了连接池,如果应用程序在使用完数据库连接后没有正确释放它们,也可能导致连接被占用而无法回收。

    4. 使用连接池监控工具: 使用连接池监控工具(如 Druid 提供的监控功能)来查看和分析连接池的实际使用情况,以便更好地理解连接池的状态和性能,并根据情况进行调整。

    5. 升级 druid 版本: 考虑升级你所使用的 druid 版本。较新的版本可能会修复已知的问题和改进性能,从而提高连接池的稳定性和性能。

    请注意,根据你提供的信息,问题似乎与数据库连接相关。由于无法直接访问你的运行环境和代码,以上建议仅供参考。建议你结合线程栈、日志和系统监控等详细信息,进一步分析和排查问题。如果问题仍然存在,建议联系阿里云技术支持或数据库专家寻求更深入的咨询和支持。

    2023-07-05 18:15:36
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载