hibernate批量插入数据,MySQL提示:1040-Too many connections

本文解决SSH项目中MySQL连接数不足导致的连接冲突问题,通过修改my.ini文件增加最大连接数,同时调整c3p0连接池参数,确保服务器稳定运行。

 2011-8-5 8:34:13 net.sf.ehcache.config.ConfigurationFactory parseConfiguration
警告: No configuration found. Configuring ehcache from ehcache-failsafe.xml  found in the classpath: jar:file:/C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp3/wtpwebapps/OgSchedule/WEB-INF/lib/ehcache-1.6.2.jar!/ehcache-failsafe.xml
2011-8-5 8:34:13 net.sf.ehcache.CacheManager detectAndFixDiskStorePathConflict
警告: Creating a new instance of CacheManager using the diskStorePath "C:\WINDOWS\TEMP\" which is already used by an existing CacheManager.
The source of the configuration was classpath.
The diskStore path for this CacheManager will be set to C:\WINDOWS\TEMP\\ehcache_auto_created_1312504453046.
To avoid this warning consider using the CacheManager factory methods to create a singleton CacheManager or specifying a separate ehcache configuration (ehcache.xml) for each CacheManager instance.
org.hibernate.exception.GenericJDBCException: Cannot open connection
。。。

=======================================================

原因:MySQL默认的连接数是100,太少!自己的SSH项目开的连接数比这个大。

解决:(windows环境)

1.到C:\Program Files\MySQL\MySQL Server 5.0下面找到my.ini文件,记事本打开,找到“max_connections=100”改成:max_connections=10000

2.设置SSH项目的c3p0.min_size(这里是c3p0连接池)小点,这里可以不去管它,不可能比10000大吧

3.管理工具--服务:重启MySQL服务


 

mysql manual有如下的说明:
mysqld actually allows
max_connections+1
clients to connect. The extra connection is reserved for use by accounts that have the
SUPER  privilege. By granting the  SUPER  privilege to administrators and not to normal users (who should not need it), an administrator can connect to the server and use SHOW PROCESSLIST to diagnose problems even if the maximum number of unprivileged clients are connected.
因此, 必须只赋予root用户的SUPER权限,同时所有数据库连接的帐户不能赋予SUPER权限。前面说到的报错后无法登录就是由于我们的应用程序直接配置的root用户

 

20:17:54:598 ERROR 36384 --- [nio-8082-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. ### The error may exist in com/hmall/cart/mapper/CartMapper.java (best guess) ### The error may involve com.hmall.cart.mapper.CartMapper.selectList ### The error occurred while executing a query ### Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up.] with root cause com.mysql.cj.exceptions.CJException: Data source rejected establishment of connection, message from server: "Too many connections" at jdk.internal.reflect.GeneratedConstructorAccessor64.newInstance(Unknown Source) ~[na:na] at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:na] at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[na:na] at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.23.jar:8.0.23] at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.23.jar:8.0.23] at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.23.jar:8.0.23] at com.mysql.cj.exceptions.ExceptionFactory.createException(Exception
最新发布
07-16
### 问题分析 在 Java Web 应用中,当出现 `MyBatisSystemException: Failed to obtain JDBC Connection` 并伴随错误信息 `'Too many connections'` 时,这通常表明数据库连接池中的连接数量已达到上限,或者数据库本身限制了最大连接数。 #### 数据库连接池配置 常见的数据库连接池包括 DBCP、HikariCP 和 C3P0 等。如果连接池未正确配置,可能导致连接泄漏或无法释放连接[^3]。例如,在使用 DBCP 连接池时,如果没有正确关闭数据库连接,可能会导致连接池中的连接耗尽,从而无法获取新的连接。 #### 数据库最大连接数限制 MySQL数据库通常会设置一个最大连接数限制(`max_connections`)。当应用尝试建立的连接数超过这个限制时,数据库会拒绝新的连接请求,并返回 `'Too many connections'` 错误[^5]。 ### 解决方案 #### 调整数据库最大连接数 可以通过修改 MySQL 的配置文件 `my.cnf` 或 `my.ini` 来调整最大连接数。找到并修改以下行: ```ini [mysqld] max_connections = 1000 ``` 保存配置文件后,重启 MySQL 服务以使更改生效。需要注意的是,增加最大连接数可能会对服务器性能产生影响,因此应根据实际需求和服务器资源进行调整。 #### 优化连接池配置 对于 DBCP 连接池,可以调整以下参数来优化连接池的行为: ```properties # 设置最大连接数 dbcp.maxTotal=100 # 设置最大空闲连接数 dbcp.maxIdle=50 # 设置最小空闲连接数 dbcp.minIdle=10 # 设置最大等待时间 dbcp.maxWaitMillis=10000 ``` 此外,确保在每次数据库操作完成后,正确关闭数据库连接,避免连接泄漏。可以使用 try-with-resources 语句来确保资源被及时释放: ```java try (Connection conn = dataSource.getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table")) { // 处理结果集 } catch (SQLException e) { // 处理异常 } ``` #### 检查代码逻辑 检查代码中是否存在长时间占用数据库连接的操作,例如大事务处理或长时间运行的查询。这些操作可能会占用连接池中的连接,导致其他请求无法获取连接。可以通过优化 SQL 查询、减少事务范围或引入异步处理来缓解这一问题。 #### 监控与日志分析 启用数据库连接池的监控功能,定期检查连接池的状态,包括当前活跃连接数、空闲连接数和等待连接数。同时,分析应用的日志,查找可能导致连接泄漏的代码路径。例如,在 Spring 中,可以启用 Hibernate 的 SQL 日志记录功能,以便跟踪数据库操作: ```properties # 启用 Hibernate SQL 日志记录 hibernate.show_sql=true hibernate.format_sql=true ``` ### 预防措施 - **定期审查代码**:确保所有数据库操作都正确关闭连接,避免连接泄漏。 - **合理配置连接池**:根据应用的实际需求和负载情况,合理设置连接池的最大连接数和其他相关参数。 - **监控系统性能**:使用监控工具实时跟踪数据库连接的使用情况,及时发现潜在问题。 - **优化数据库性能**:通过索引优化、查询优化等手段提高数据库的响应速度,减少连接占用时间。 通过以上方法,可以有效解决 `MyBatisSystemException: Failed to obtain JDBC Connection` 并伴随 `'Too many connections'` 错误的问题,提升应用的稳定性和性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值