牧歌ing 2025-01-03 13:35 采纳率: 42.9%
浏览 509
已结题

数据库连接池异常,active =0,maxActive =100

数据库连接池异常


### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60032, active 0, maxActive 100, creating 1, createElapseMillis 7975, createErrorCount 5
    at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
    at sun.reflect.GeneratedMethodAccessor396.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
    ... 82 common frames omitted
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60032, active 0, maxActive 100, creating 1, createElapseMillis 7975, createErrorCount 5
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)
    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:336)
    at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:86)
    at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
    at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324)
    at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
    at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
    at com.github.pagehelper.PageInterceptor.intercept(PageInterceptor.java:111)
    at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61)
    at com.sun.proxy.$Proxy321.query(Unknown Source)
    at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
    ... 87 common frames omitted
Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 60032, active 0, maxActive 100, creating 1, createElapseMillis 7975, createErrorCount 5
    at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1899)
    at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:1504)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5074)
    at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:724)
    at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:5070)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1479)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1469)
    at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:83)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
    ... 99 common frames omitted
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Read timed out ClientConnectionId:7c94d7c6-45b6-4b91-a75f-eae983b8a727
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.terminate(SQLServerConnection.java:2924)
    at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:2029)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.Prelogin(SQLServerConnection.java:2635)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:2480)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:2142)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectInternal(SQLServerConnection.java:1993)
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:1164)
    at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:760)
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:132)
    at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:244)
    at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:126)
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1699)
    at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1794)
    at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2967)
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at com.microsoft.sqlserver.jdbc.TDSChannel.read(IOBuffer.java:2023)
    ... 12 common frames omitted

img

以下是数据库的配置

img

  • 写回答

16条回答 默认 最新

  • 檀越@新空间 2025-01-03 13:46
    关注
    获得0.60元问题酬金

    下午好🌅🌅🌅
    本答案参考通义千问

    从异常信息来看,问题出在获取数据库连接时超时。具体表现为 active = 0(当前活跃的连接数为0),maxActive = 100(最大连接数为100),但仍然无法获得连接。这可能是因为数据库连接池配置不当或数据库服务器响应缓慢导致的。

    以下是排查和解决该问题的一些步骤:

    1. 检查数据库连接配置

      • 确认 minIdleinitialSize 配置是否合理。这些参数定义了连接池中最小空闲连接数和初始化连接数。
      • 确认 maxWait 参数是否设置合理。这个参数表示等待获取连接的最大时间(毫秒)。
    2. 检查数据库服务器状态

      • 确认数据库服务器是否正常运行,并且没有达到最大连接数限制。
      • 使用数据库管理工具检查当前连接数和等待连接的情况。
    3. 优化SQL查询

      • 检查是否有慢查询导致数据库处理速度变慢,从而影响连接池性能。
      • 使用数据库性能分析工具(如SQL Server Profiler)来找出执行时间较长的查询。
    4. 调整连接池配置

      • 如果连接池经常满,可以考虑增加 maxActive 的值。
      • 调整 timeBetweenEvictionRunsMillisminEvictableIdleTimeMillis 参数,确保连接池中的连接定期被检测和清理。
    5. 监控和日志记录

      • 启用连接池的日志记录功能,以便于跟踪连接池的行为。
      • 定期检查连接池的性能指标,如活跃连接数、空闲连接数等。

    修改后的配置示例

    假设使用的是Druid连接池,以下是一些可能需要调整的配置项:

    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
    
        <!-- 最大连接数 -->
        <property name="maxActive" value="150"/>
    
        <!-- 初始连接数 -->
        <property name="initialSize" value="5"/>
    
        <!-- 最小空闲连接数 -->
        <property name="minIdle" value="5"/>
    
        <!-- 获取连接时最大等待时间(毫秒) -->
        <property name="maxWait" value="60000"/>
    
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000"/>
    
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="300000"/>
    
        <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
        <property name="poolPreparedStatements" value="true"/>
        <property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
    
        <!-- 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 -->
        <property name="filters" value="stat,wall,log4j"/>
    </bean>
    

    通过上述配置调整,可以更好地管理数据库连接池,减少因连接不足导致的错误。

    评论

报告相同问题?

问题事件

  • 系统已结题 1月18日
  • 赞助了问题酬金15元 1月10日
  • 修改了问题 1月3日
  • 修改了问题 1月3日
  • 展开全部