解决Data source rejected establishment of connection, message from server: "Too many connections"连接问题

本文探讨了数据库连接数超出限制的问题,分析了连接池最大连接数限制与数据库本身最大连接数限制的原因,并提供了具体的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到这个问题,从字面意思也可以看出来是数据库连接数超出限制的问题,那么如何解决呢?

现在的项目开发中多数会用到JDBC连接池,比如c3p0等,那么可想而知数据库连接数的问题无非就是和数据本身的设置和连接池的参数设置有关。

情况一,连接池最大连接数限制。

c3p0 的设置一般如下:(本人使用了Spring框架,所以在bean中定义,若是其他properties设置文件类似)


<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">       
     <property name="driverClass" value="com.mysql.jdbc.Driver"/>       
     <property name="jdbcUrl" value="jdbc:mysql://192.168.96.158:3306/itsm?useUnicode=true&amp;characterEncoding=gbk"/>
     <property name="user" value="eccom"/>       
     <property name="password" value="eccom"/>       
     <property name="initialPoolSize" value="0"/> <!-- 连接池初始化时创建的连接数,default : 3(建议使用)-->
     <property name="minPoolSize" value="3"/> <!-- :连接池保持的最小连接数,default : 3(建议使用)-->
     <property name="maxPoolSize" value="1000"/> <!-- :连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放,所以这个值有可能会设计地很大,default : 15(建议使用)-->
     <property name="acquireIncrement" value="3"/> <!-- :连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3(建议使用)-->
     <property name="maxConnectionAge" value="0"/> <!-- :配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。default : 0 单位 s(不建议使用)-->
     <property name="maxIdleTime" value="0"/> <!-- :连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。如果为0,则永远不会断开连接,即回收此连接。default : 0 单位 s(建议使用)-->
     <property name="maxIdleTimeExcessConnections" value="0"/> <!-- :这个配置主要是为了快速减轻连接池的负载,比如连接池中连接数因为某次数据访问高峰导致创建了很多数据连接,但是后面的时间段需要的数据库连接数很少,需要快速释放,必须小于maxIdleTime。其实这个没必要配置,maxIdleTime已经配置了。default : 0 单位 s(不建议使用)-->
     <property name="preferredTestQuery" value="select count(id) from t_common_menu"/> <!-- :与上面的automaticTestTable二者只能选一。自己实现一条SQL检测语句。default : null(建议使用)-->
     <property name="idleConnectionTestPeriod" value="3600"/> <!-- ::用来配置测试空闲连接的间隔时间。测试方式还是上面的两种之一,可以用来解决MySQL8小时断开连接的问题。因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将于MySQL8小时无会话的状态打破。为0则不测试。default : 0(建议使用)-->
     <property name="testConnectionOnCheckin" value="false"/> <!-- :如果为true,则在close的时候测试连接的有效性。default : false(不建议使用)-->
     <property name="testConnectionOnCheckout" value="false"/> <!--:性能消耗大。如果为true,在每次getConnection的时候都会测试,为了提高性能,尽量不要用。default : false(不建议使用)-->
     <property name="acquireRetryAttempts" value="30"/> <!--:连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。default : 30(建议使用)-->
     <property name="acquireRetryDelay" value="1000"/> <!--:连接池在获得新连接时的间隔时间。default : 1000 单位ms(建议使用)-->
     <property name="maxStatementsPerConnection" value="0"/>

以上配置中标黄的部分就是最大连接数的设置。

情况二,数据库本身最大连接数限制。

如果设置了连接池参数仍然报错,则很有可能是数据库本身设置的问题,如果没有谁用连接池配置,则可直接查看数据库本身设置。

在数据库(以mysql为例)中输入一下命令:

show variables like "max_connections"; //显示最大连接数
show processlist ;//显示当前连接数
set global max_connections=1000//设置最大连接数1000


通过以上两种方法一般可以解决,另外可以通过如下代码查看程序执行时的连接池状况。

@Autowired 
private ComboPooledDataSource dataSource;

----------------------

System.out.println(dataSource.getMaxPoolSize());// 最大连接数
        System.out.println(dataSource.getMinPoolSize());// 最小连接数
        System.out.println(dataSource.getNumBusyConnections());// 正在使用连接数
        System.out.println(dataSource.getNumIdleConnections());// 空闲连接数
        System.out.println(dataSource.getNumConnections());// 总连接数


以上总结如有错误,欢迎指正,本人也是小白一名,希望能和大家一起学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值