项目框架:springmvc+spring3+mybatis
数据库:mysql5.5
服务器是阿里云的,但实际上阿里云的机器是万网的,配置为
,
有这么一个需求,就是需要批处理向数据库一次性插入50000条数据,当时对表做了分区,开始是只用一次插入操作插入50000条数据,debug时到执行插入的时候就突然卡住了,卡到我的耐心资源超时,所以就把它咔嚓了。然后改了代码,换成一个java For 循环,一次只插1000条数据循环50次插入,大约7.3秒插入完成。接着又换成每次插10000条,分循环5次插入,时间为6.4秒。没道理一次50000需要这么久的时间,于是昨天临走前机器没关,让它跑一次50000条的插入,看看究竟会怎样。第二天早上发现插入失败,日志打了异常:
org.springframework.dao.TransientDataAccessResourceException:
### Error updating database. Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (3500111 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
### The error may involve com.yiliwu.ecouponcard.core.dao.EcKeyMapper.insertBatch-Inline
### The error occurred while setting parameters
### Cause: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (3500111 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
; SQL []; Packet for query is too large (3500111 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.; nested exception is com.mysql.jdbc.PacketTooBigException: Packet for query is too large (3500111 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
可见mysql服务器端的参数max_allowed_packet设置过小了,它默认是1M,而我们提交的Packet有3M。登录服务器,找到mysql的配置文件my.cnf,在[mysqld]下加上max_allowed_packet=16M,保存重启mysql后,一次插入50000条成功,耗时7.2秒。
对于在for循环中插入数据库操作会造成多次IO性能损耗,必然会在一定程度上减慢插入速度,所以循环50次与循环5次的差异还是可以看到的,7.3>6.4,但是一次50000条的耗时为7.2还是耐人琢磨,我将它暂时归为不完全归纳造成的误差,毕竟不同时段主机的忙闲还是会有些差异的,理论上应该会更快。
分享到:
相关推荐
### MySQL 5.7 中 max_allowed_packet 参数的理解与调整 #### 一、max_allowed_packet 参数简介 在MySQL数据库中,`max_allowed_packet` 参数用于控制客户端与服务器之间单个数据包的最大大小。此参数对诸如大BLOB...
MySQL中的`max_allowed_packet`参数是一个非常重要的设置,它决定了MySQL服务器能够接收的最大数据包大小。这个设置在处理大数据操作,如导入大体积的数据文件、执行包含大量数据的SQL语句时尤其关键。如果某个...
在MySQL数据库中,`max_allowed_packet` 是一个非常重要的参数,它定义了客户端与服务器之间可以传输的最大数据包大小。这个参数对处理大数据操作,如导入大文件、执行大查询或者传输大对象(如BLOB或TEXT列)时至关...
mysql设置max_allowed_packet_解决_MySQL_Error_2006
在MySQL数据库系统中,`max_allowed_packet`是一个非常重要的配置参数,它决定了服务器可以处理的最大数据包大小。这个参数主要用于限制单次传输的数据量,防止因大数据操作导致内存溢出或者网络阻塞。在MySQL 5.5...
例如,`mysql`客户端有一个名为`max_allowed_packet`的变量,用于控制通信缓冲区的最大大小。要将`max_allowed_packet`变量设置为16MB,可以使用以下命令: - `mysql --max_allowed_packet=16777216` - `mysql --max...
在MySQL数据库系统中,`max_allowed_packet`是一个关键的系统变量,它决定了服务器能够处理的最大数据包大小。这个参数主要用于限制单次传输的数据量,包括INSERT、UPDATE等操作中的大块数据,以及LOAD DATA INFILE...
MySQL max_allowed_packet过小引起的问题报错如下com.mysql.jdbc.PacketTooBigException: Packet
- **max_allowed_packet=16M**:单个通信包的最大大小,对于大事务处理非常重要。 - **binlog_cache_size=2M**:每条SQL语句二进制日志缓存的大小,有助于减少磁盘I/O操作。 - **max_heap_table_size=64M**:单个...
- **max_allowed_packet**: 单条SQL语句的最大长度,根据业务需求调整。 - **binlog_cache_size/max_binlog_cache_size**: 事务处理过程中临时缓存大小。 - **max_binlog_size**: 单个binlog文件的最大大小。 - **...
- **max_allowed_packet**: 允许客户端发送到服务器的最大包大小。 - **sort_buffer_size**/**join_buffer_size**: 分别用于排序操作和连接操作的缓冲区大小。 - **thread_cache_size**: 连接线程缓存大小,用于复用...
max_allowed_packet=1024M max_connections=1000 # Recommended in standard MySQL setup sql_mode=NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION wait_timeout=2147483 ...
- **max_allowed_packet**: 最大数据包大小。 - **innodb_open_files**: InnoDB 引擎可以打开的最大文件数。 #### F5 负载均衡器配置 F5 负载均衡器用于分发请求到不同的 MySQL 服务器,确保负载均衡并提高系统的...
然而,在实际应用中,特别是涉及大数据量的`LONGBLOB`字段时,可能会遇到一些限制问题,尤其是在MySQL 5.5版本中,默认的`max_allowed_packet`变量值为1MB,这可能导致插入超过1MB的数据时出现错误。 当尝试插入的...
- **slave_max_allowed_packet**: 从库接收的最大数据包大小。 - **back_log**: 监听队列长度。 - **wait_timeout**: 客户端空闲超时时间。 - **long_query_time**: 长查询的阈值时间。 #### 三、缓存池工作机制...