Cause: java.sql.SQLException: The total number of locks exceeds the lock table size解决办法

web应用插入mysql库时,报如下异常:

### Cause: java.sql.SQLException: The total number of locks exceeds the lock table size
; uncategorized SQLException for SQL []; SQL state [HY000]; error code [1206]; The total number of locks exceeds the lock table size; nested exception is java.sql.SQLException: The total number of locks exceeds the lock table size] with root cause
java.sql.SQLException: The total number of locks exceeds the lock table size
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3973)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
	at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:873)
	at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:2370)
	at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2736)
	at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2484)
	at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
	at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1197)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3051)
	at com.alibaba.druid.filter.FilterAdapter.preparedStatement_execute(FilterAdapter.java:1080)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049)
	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_execute(FilterEventAdapter.java:440)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_execute(FilterChainImpl.java:3049)
	at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.execute(PreparedStatementProxyImpl.java:168)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.execute(DruidPooledPreparedStatement.java:494)
	at sun.reflect.GeneratedMethodAccessor119.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59)
	at com.sun.proxy.$Proxy116.execute(Unknown Source)
	at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:63)
	at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79)
	at sun.reflect.GeneratedMethodAccessor184.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
	at com.sun.proxy.$Proxy114.query(Unknown Source)

InnoDB表执行大批量数据的更新,插入,删除操作时会出现这个问题,需要调整InnoDB全局的innodb_buffer_pool_size的值来解决这个问题,并且重启mysql服务。

windows cmd:

mysql -u root -p

密码:xxxxx

进入mysql命令

show variables like “%_buffer%”;(不要忘记带;号,没有;号表示一条语句没有结束)

默认的innodb_buffer_pool_size=8M

显示的格式是 1M10241024,设置的时候也要这样设置,例如

修改 innodb_buffer_pool_size的值为3G:

SET GLOBAL innodb_buffer_pool_size=67108864;(310241024*1024,不要忘记;号)


我用的是Mysql5.7,不用重启服务,并且只需直接在navicat里面执行语句即可。

`Cause: java.sql.SQLException: The used SELECT statements have a different number of columns` 这种异常通常发生在尝试从数据库读取数据时。它表明你在查询数据库的过程中遇到了一个错误,具体是因为两个或多个人试图执行的 SELECT 查询语句返回了不同数量的列。 这种错误可能是由以下几个原因造成的: 1. **SQL语法差异**:查询语句可能包含不同的列名、数量或顺序。例如,两个查询可能分别查询了表的不同字段,导致返回的列数不同。 2. **数据库结构变化**:数据库的表结构发生了改变,但应用程序仍然基于旧的模式来构建查询。这可能导致新查询返回的列数与之前应用的查询返回的列数不同。 3. **动态生成查询字符串**:如果查询是由程序动态生成的,并且生成过程中出错(如拼接的字符串中列名不一致),那么可能会遇到这个异常。 4. **错误的数据映射**:当使用 ORM(对象关系映射)工具将数据库结果映射到 Java 对象时,如果数据库返回的列数与预期不符,则可能出现此异常。 5. **外部系统交互**:如果你的应用程序需要通过服务接口或其他外部系统获取数据,并且这些系统的响应格式发生变化,也可能引发此类错误。 ### 解决步骤: 1. **检查SQL查询语句**:确保所有用于连接和查询数据库的 SQL 语句返回相同的列集。确认所有的列名和查询条件都是一致的。 2. **审查数据库表结构**:确认数据库表的当前结构与你的应用预期的一致。如果有结构变更,更新相应的查询或应用配置。 3. **调试动态生成的查询**:如果是动态生成的查询,检查生成过程中的逻辑是否正确处理了所有可能的情况,特别是列名和数量的变化。 4. **验证数据映射逻辑**:对于使用 ORM 的情况,检查实体类是否正确映射了数据库的所有列。同时,确保数据转换和处理函数能够适应可能的列数变化。 5. **监控和日志**:增加日志记录功能,以便更详细地查看查询语句、返回的结果以及应用程序如何处理这些结果。这有助于定位问题的具体位置。 6. **单元测试**:编写针对关键查询的单元测试,确保在各种可能的情况下都能正确处理数据。 ### 相关问题: 1. 如何预防SQL查询语句返回不同数量的列的问题? 2. 当发现这个异常时应该如何调试? 3. 面对动态生成查询语句的情况,有哪些策略可以避免这类异常的发生?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山月神话

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值