The driver has not received any packets from the server

在测试数据迁移时遇到的错误。

目录

一、错误

二、解决

三、数据迁移测试

3.1 环境

3.2 源码及测试

3.2.1 源码

3.2.2 测试结果(太慢)

3.2.3 源码修改

3.2.4 异常及解决


一、错误

The driver has not received any packets from the server.

二、解决

 经排查是因为MySQL版本与mysql-connector-java版本对应不上(本地和远程数据库5,而mysql-connector-java依赖包是8)

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.13</version>
</dependency>

解决:在pom.xml中修改mysql-connector-java的版本为5.1.49即可

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version>
</dependency>

再将驱动类

Class.forName("com.mysql.cj.jdbc.Driver");

修改为

Class.forName("com.mysql.jdbc.Driver");

做如下测试发现的问题。

三、数据迁移测试

3.1 环境

  • Maven Project
  • JDK 8
  • Mac Book pro内存32GB
  • 表信息:72382条数据量 ,2.47GB存储空间

3.2 源码及测试

程序说明:把别人的mysql库中数据迁移到本地库中。

为什么要写这样程序?

        最简单的办法是用navicat工具复制粘贴即可。

       

痛点:navicat工具复制粘贴是一条一个数据的插入的,效率很低,搞不好navicat直接就挂了(出现卡死的情况)。数据见下图


找到表所在磁盘(如上图),数据量为72382条,大概为2.47GB

有很多种办法可以解决这个问题,想写个程序来实现这个数据迁移的需求。所以出现了标题的错误提示

3.2.1 源码

pom.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>jdbc2</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- MYSQL连接数据 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.49</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>compile</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version><scope>compile</scope></dependency></dependencies></project>

实现数据迁移源码测试类如下:

package xiao.xian;import org.junit.Before;import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 从mysql5.7库迁移到mysql5.7库 <br/>** @author xiaoxian* @date 2023/9/14 16:44:25*/
public class DataTransTest {private Connection conn1 = null;private Statement stmt1 = null;private Connection conn2 = null;private PreparedStatement stmt2 = null;public void init() throws ClassNotFoundException, SQLException {Class.forName("com.mysql.cj.jdbc.Driver");// 建立连接  url格式 - JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…conn1 = DriverManager.getConnection("jdbc:mysql://192.168.200.119:3306/dayloan_trans_dev?userSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT", "root", "20191224123");stmt1 = conn1.createStatement();conn2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/dayloan_trans_dev?userSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT", "root", "20191224123");stmt2 = conn2.prepareStatement("insert into credit_reporting_query_log2(`id`, `user_id`, `name`, `id_no`, `request`, `request_id`, `message_id`, `query_type`, `query_reason`, `report_type`, `query_org_code`, `response`, `status`, `message`, `create_time`) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");}@org.junit.Testpublic void trans() {try {init();// 已知是7.2万条数据,数据大小为2.4GB// 测试10000条数据迁移耗时情况for (int i = 0; i < 2; i++) {// 查5000条数据List<Map<String, Object>> list = loadData(i, 5000);// 5000条提交一次batchInsert(list);}stmt1.close();conn1.close();} catch (Exception se) {// 处理 JDBC 错误se.printStackTrace();} finally {// 关闭资源try {if (stmt1 != null) {stmt1.close();}} catch (SQLException ignored) {}try {if (conn1 != null) {conn1.close();}} catch (Throwable ignore) {}try {if (stmt2 != null) {stmt2.close();}} catch (SQLException ignored) {}try {if (conn2 != null) {conn2.close();}} catch (Throwable ignore) {}}System.out.println("Finish.");}private List<Map<String, Object>> loadData(int pageNum, int size) throws SQLException {String sql = "SELECT * FROM credit_reporting_query_log limit " + (pageNum  * size) + "," + size;ResultSet rs = stmt1.executeQuery(sql);List<Map<String, Object>> list = new ArrayList<>(size);// 展开结果集数据库while (rs.next()) {Map<String, Object> map = new HashMap<>(16);map.put("id", rs.getInt("id"));map.put("project_record", rs.getString("project_record"));map.put("borrower_record", rs.getString("borrower_record"));map.put("guaranty_house_record", rs.getString("guaranty_house_record"));map.put("create_time", rs.getDate("create_time"));map.put("update_time", rs.getDate("update_time"));map.put("project_log_id", rs.getString("project_log_id"));list.add(map);}rs.close();return list;}private void batchInsert(List<Map<String, Object>> dataList) throws SQLException {for (Map<String, Object> map : dataList) {stmt2.setString(1, (String) map.get("id"));stmt2.setString(2, (String) map.get("project_record"));stmt2.setString(3, (String) map.get("borrower_record"));stmt2.setString(4, (String) map.get("guaranty_house_record"));stmt2.setDate(5, (Date) map.get("create_time"));stmt2.setDate(6, (Date) map.get("update_time"));stmt2.setString(7, (String) map.get("project_log_id"));stmt2.addBatch();}stmt2.executeBatch();}}

3.2.2 测试结果(太慢)

测试(数据量72382,大概2.47GB)

测试每5000条数据提交一次,提交2次,总共提交了10000条数据,耗时260023毫秒即4分多钟,太慢了。

在磁盘中查看文件大小为331.MB,则每条数据大概33.9kb

3.2.3 源码修改

package xiao.xian;import java.sql.*;/*** 从mysql5.7库迁移到mysql5.7库 <br/>** @author xiaoxian* @date 2023/9/14 16:44:25*/
public class DataTransTest2 {private Connection conn1 = null;private Statement stmt1 = null;private Connection conn2 = null;private Statement stmt2 = null;public void init() throws ClassNotFoundException, SQLException {Class.forName("com.mysql.jdbc.Driver");// 建立连接  url格式 - JDBC:子协议:子名称//主机名:端口/数据库名?属性名=属性值&…conn1 = DriverManager.getConnection("jdbc:mysql://192.168.200.119:3306/dayloan_trans_dev?userSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT", "root", "20191224123");stmt1 = conn1.createStatement();conn2 = DriverManager.getConnection("jdbc:mysql://localhost:3306/dayloan_trans_dev?userSSL=true&useUnicode=true&characterEncoding=UTF8&serverTimezone=GMT", "root", "20191224123");stmt2 = conn2.createStatement();}@org.junit.Testpublic void trans() {System.out.println(System.currentTimeMillis());long start = 0;try {init();start = System.currentTimeMillis();// 已知是7.2万条数据,数据大小为2.4GB// 测试10000条数据迁移耗时情况for (int i = 0; i < 5; i++) {// 2000条提交一次loadAndInsert(i, 2000);}stmt1.close();conn1.close();} catch (Exception se) {// 处理 JDBC 错误se.printStackTrace();} finally {// 关闭资源try {if (stmt1 != null) {stmt1.close();}} catch (SQLException ignored) {}try {if (conn1 != null) {conn1.close();}} catch (Throwable ignore) {}try {if (stmt2 != null) {stmt2.close();}} catch (SQLException ignored) {}try {if (conn2 != null) {conn2.close();}} catch (Throwable ignore) {}}long end = System.currentTimeMillis();System.out.println("Finish." + (end - start));}private void loadAndInsert(int pageNum, int size) throws SQLException {String sql = "SELECT * FROM project_log_detail limit " + (pageNum  * size) + "," + size;ResultSet rs = stmt1.executeQuery(sql);int i = 0;StringBuffer insertSQL = new StringBuffer("INSERT INTO project_log_detail2 VALUES");while (rs.next()) {if (i > 0) {insertSQL.append(",");}i++;insertSQL.append("('"+rs.getString("id")+"'").append(",");insertSQL.append("'"+rs.getString("project_record")+"'").append(",");insertSQL.append("'"+rs.getString("borrower_record")+"'").append(",");insertSQL.append("'"+rs.getString("guaranty_house_record")+"'").append(",");insertSQL.append("'"+rs.getDate("create_time")+"'").append(",");insertSQL.append("'"+rs.getDate("update_time")+"'").append(",");insertSQL.append("'"+rs.getString("project_log_id")+"')");}stmt2.addBatch(insertSQL.toString());//设置为不自动提交conn2.setAutoCommit(false);stmt2.executeBatch();//手动提交conn2.commit();//恢复现场conn2.setAutoCommit(true);}}

数据量72382,大概占磁盘空间2.47GB

数据量占磁盘空间太大,只测试10000条数据的情况。测试结果如下表:(从结果上看,比上一个程序快了一点点)

每次查询 和 提交数据量耗时(毫秒)
1000(总数据量10000)144736
2000(总数据量10000)143752
2500(总数据量10000)131341
3333(总数据量10000)140339
5000(总数据量10000)145205

即:在本机的环境下(10000条数据,每条数据33.9kb),每次读写2500条左右的数据速度是最快的。

3.2.4 异常及解决

设置提交为1000条时报如下错误:

java.sql.BatchUpdateException: Packet for query is too large (21342389 > 20971520). You can change this value on the server by setting the max_allowed_packet' variable.

max_allowed_packet是mysql服务器端和客户端在一次传送数据包的过程当中最大允许的数据包大小,默认是20MB。

解决:修改这个值大点即可

一种是修改my.cnf(windows是my.ini)配置文件修改max_allowed_packet的大小(永久生效)

[mysqld]
max_allowed_packet = 512M

另一种是执行命令修改max_allowed_packet的大小

set global max_allowed_packet = 512 * 1024 * 1024;

命令行修改之后,需要退出当前回话(关闭当前mysql server链接),然后重新登录才能查看修改后的值。通过命令行修改只能临时生效,如果下次数据库重启后对应的配置就会又复原了,因为重启的时候加载的是配置文件里面的配置项

注:max_allowed_packet 最大值是1G(1073741824),如果设置超过1G,查看最终生效结果也只有1G

PS: 这种迁移方式只是一种尝试和测试,在实际的数据库迁移工作中,不建议这样迁移数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/81122.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学建模——微分方程介绍

一、基础知识 1、一阶微分方程 称为一阶微分方程。y(x0)y0为定解条件。 其常规求解方法&#xff1a; &#xff08;1&#xff09;变量分离 再两边积分就可以求出通解。 &#xff08;2&#xff09;一阶线性求解公式 通解公式&#xff1a; 有些一阶微分方程需要通过整体代换…

四种常用的自动化测试框架

一直想仔细研究框架&#xff0c;写个流水账似的测试程序不难&#xff0c;写个低维护成本的测试框架就很难了&#xff0c;所以研究多种测试框架还是很有必要的&#xff0c;知道孰优孰劣&#xff0c;才能在开始编写框架的时候打好基础&#xff0c;今天读到了KiKi Zhao的翻译文章&…

Java实现Ip地址获取

Java实现Ip地址获取 一、两种实现方式二、测试结果 一、两种实现方式 package com.lyp;import org.apache.commons.lang3.ObjectUtils;import java.net.*; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import java.util.Optional;/***…

Linux Ubuntu20.04深度学习环境快速配置命令记录

一、驱动安装 1、更新系统包 sudo apt-get updatesudo apt-get upgrade 2、安装显卡驱动 使用apt方式安装驱动&#xff0c;多数情况不容易成功&#xff0c; 使用一下方法更佳&#xff1a; 1.查看合适显卡的驱动版本 ubuntu-drivers devices NVIDIA GeForce 驱动程序 - …

git压缩仓库

git 压缩仓库 git gc命令压缩增量存储单元,节省磁盘空间 du -sh 查看当前文件夹占用多少K 快照的存储: 对于修改的内容,做快照处理并保存. 对于未修改的文件,做引用处理.

SOLIDWORKS Composer位置关键帧的使用

SOLIDWORKS Composer是专业的SOLIDWORKS及3D文件处理的动画制作软件&#xff0c;作为SOLIDWORKS 产品线下的一个明星存在。 SOLIDWORKS Composer几乎可以处理任何SOLIDWORKS的模型文件并将之转化成可以动作的机械动画&#xff0c;可以引用在企业的网站、产品说明书以及工作指导…

MySQL 面试题——MySQL 基础

目录 1.什么是 MySQL&#xff1f;有什么优点&#xff1f;2.MySQL 中的 DDL 与 DML 是分别指什么&#xff1f;3.✨数据类型 varchar 与 char 有什么区别&#xff1f;4.数据类型 BLOB 与 TEXT 有什么区别&#xff1f;5.DATETIME 和 TIMESTAMP 的异同&#xff1f;6.✨MySQL 中 IN …

STM32F4X SPI W25Q128

STM32F4X SPI W25Q128 什么是SPISPI的特点SPI通信引脚SPI接线方式SPI速率SPI通信方式SPI时钟相位和时钟极性 STM32F4X SPISTM32F4X SPI配置STM32F4X SPI频率 W25Q128W25Q128存储结构W25Q128读写操作W25Q128常用指令读取ID命令(0x90)写使能命令(0x06)禁止写使能命令(0x04)读取W2…

黑马JVM总结(七)

&#xff08;1&#xff09;StringTable_编译器优化 “a”“b”对应#4&#xff1a;是去常量池中找ab的这个符号 astore 5&#xff1a;是把这个存入编号为5的局部变量 “ab”对应的指令 #4&#xff0c;跟“a”“b”对应#4下面弄是一样的 在执行s3“ab”这行个代码时&#xf…

在PHP8中向数组添加元素-PHP8知识详解

在php8中向数组添加元素有多种方法&#xff0c;在这里主要讲解几个常用的方法&#xff1a;使用方括号[]添加元素、使用array_unshift()函数&#xff0c;向数组的头部添加元素、使用array_push()函数&#xff0c;向数组的尾部添加元素、使用array_splice()函数添加元素。 1、使用…

学习Bootstrap 5的第十三天

目录 提示框 如何创建提示框 实例 指定提示框的位置 实例 弹出框 如何创建弹出框 实例 指定弹出框的位置 实例 关闭弹出框 实例 提示框 提示框是一个小小的弹窗&#xff0c;在鼠标移动到元素上显示&#xff0c;鼠标移到元素外就消失。 如何创建提示框 Bootstrap…

LeetCode 332. Reconstruct Itinerary【欧拉回路,通路,DFS】困难

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

Vue3+ElementUI使用

<!DOCTYPE html> <html> <head><meta charset"UTF-8"><meta name"viewport" content"initial-scale1.0,maximum-scale1.0,minimum-scale1.0,user-scalable0, widthdevice-width"/><!-- 引入样式 --><lin…

【C++】list的模拟实现【完整理解版】

目录 一、list的概念引入 1、vector与list的对比 2、关于struct和class的使用 3、list的迭代器失效问题 二、list的模拟实现 1、list三个基本函数类 2、list的结点类的实现 3、list的迭代器类的实现 3.1 基本框架 3.2构造函数 3.3 operator* 3.4 operator-> 3…

bug总结问题集和知识点集(一)

目录 一 bug问题集1. 端口被占用 二 oracle1. oracle查看版本怎么操作2. oracle数据库&#xff1a;参数个数无效![在这里插入图片描述](https://img-blog.csdnimg.cn/6a2eebc164f9406c81525371893bbd11.png)3. ORACLE数据库如何完整卸载? 三 mybatis1. mybatis用注解如何实现模…

学习Node js:raw-body模块源码解析

raw-body是什么 raw-body的主要功能是处理HTTP请求体的原始数据。它提供了以下核心功能&#xff1a; 解析请求体&#xff1a;可以从HTTP请求中提取原始数据&#xff0c;包括文本和二进制数据。配置选项&#xff1a;通过配置项&#xff0c;可以设置请求体的大小限制、编码方式…

【LeetCode-简单题KMP】232. 用栈实现队列

文章目录 题目方法一&#xff1a;用输入栈和输出栈模拟队列 题目 方法一&#xff1a;用输入栈和输出栈模拟队列 只有输出栈为空的时候才能将输入栈的元素补充到输出栈&#xff0c;否则输出栈不为空&#xff0c;如果再从输入栈往输出栈填充元素&#xff0c;就会弄乱队列的先进先…

【SpringMVC】拦截器JSR303的使用

【SpringMVC】拦截器&JSR303的使用 1.1 什么是JSR3031.2 为什么使用JSR3031.3 常用注解1.4 Validated与Valid区别1.5 JSR快速入门1.5.2 配置校验规则# 1.5.3 入门案例二、拦截器2.1 什么是拦截器2.2 拦截器与过滤器2.3 应用场景2.4 拦截器快速入门2.5.拦截器链2.6登录案列权…

接口测试——接口协议抓包分析与mock_L1

目录&#xff1a; 接口测试价值与体系常见的接口协议接口测试用例设计postman基础使用postman实战练习 1.接口测试价值与体系 接口测试概念 接口&#xff1a;不同的系统之间相互连接的部分&#xff0c;是一个传递数据的通道接口测试&#xff1a;检查数据的交换、传递和控制…

设计模式之职责链模式

职责链模式:使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 这里发出这个请求的客户端并不知道这当中的哪一个对象最终处理这个请求&am…