The driver has not received any packets from the server

news2024/11/18 17:28:15

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

目录

一、错误

二、解决

三、数据迁移测试

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.Test
    public 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.Test
    public 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.coloradmin.cn/o/1018129.html

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

相关文章

关于软件测试的方法详解,你知道多少呢?

一、 软件测试方法 1. 软件测试方法包括&#xff1a;白盒测试(White Box Testing)、黑盒测试(Black Box Testing)、灰盒测试、静态测试、动态测试。 2. 白盒测试&#xff1a;是一种测试用例设计方法&#xff0c;在这里盒子指的是被测试的软件&#xff0c;白盒&#xff0c;顾名…

想要精通算法和SQL的成长之路 - 最长回文子序列

想要精通算法和SQL的成长之路 - 最长回文子序列 前言一. 最长回文子序列 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 最长回文子序列 原题链接 首先&#xff0c;我们看下动态规划方程的定义&#xff0c;我们用dp[i][j] 来代表&#xff1a;字符串s在下标区间为[i,j]之间…

Java“牵手”lazada商品列表页数据采集+lazada商品价格数据排序,lazadaAPI接口申请指南

Lazada是东南亚首屈一指的网上购物平台&#xff0c;中文名为来赞达&#xff0c;拥有较多的品牌和销售商。2016年&#xff0c;Lazada成为阿里巴巴集团的区域旗舰&#xff0c;并得到了阿里巴巴一流的技术基础设施的支持。 Lazada来赞达在2012年成立&#xff0c;总部设在新加坡&a…

JavaScript基础知识11——运算符:赋值运算符

哈喽&#xff0c;大家好&#xff0c;我是雷工&#xff01; 今天公乌素这缺水的镇子&#xff0c;稀稀拉拉下了一天的雨&#xff0c;一场秋雨一场寒&#xff0c;风开始愈发清凉。 看日历发现明天就是二十四节气里的白露了&#xff0c;都白露了&#xff0c;原来不知不觉已经深秋了…

笔记(五)-传统图机器学习的特征工程-全图

1、引言 -提取出的特征要能够反应全图结构特点 2、全图信息种类 Bag-of-Nodes Bag-of-Nodes degrees -就是找同分异构体 -和节点特征的子图不同的是 可以存在孤立结点计算全图的子图个数&#xff0c;而不是特定邻域的子图个数 Graphlet kernel -两个图作数量积&#xff0c;…

Unity 安装及运行MLAgents

1、下载ML-Agents 下载地址 GitHub - Unity-Technologies/ml-agents: The Unity Machine Learning Agents Toolkit (ML-Agents) is an open-source project that enables games and simulations to serve as environments for training intelligent agents using deep reinfo…

如何修复丢失的vcruntime140_1.dll文件

在编程中&#xff0c;我们经常会遇到各种问题和挑战。其中之一就是缺少必要的运行库文件&#xff0c;如vcruntime140_1.dll&#xff0c;这可能会导致我们的程序无法正常运行。本文将详细介绍6种解决此问题的方法&#xff0c;并详细讲解vcruntime140_1.dll文件的作用。 vcruntim…

企业级SpringBoot单体项目模板 —— 全局配置

&#x1f61c;作 者&#xff1a;是江迪呀✒️本文关键词&#xff1a;SpringBoot、模版、企业级☀️每日 一言&#xff1a;你坚持下来了&#xff0c;而别人坚持不下来&#xff0c;这就是你的资本。 文章目录 一、全局异常配置1.1 全局异常处理1.2 处理业务异常类1.3…

并查集 size 的优化

我们把如下图所示的并查集&#xff0c;进行 union(4,9) 操作。 合并操作后的结构为&#xff1a; 可以发现&#xff0c;这个结构的树的层相对较高&#xff0c;若此时元素数量增多&#xff0c;这样产生的消耗就会相对较大。解决这个问题其实很简单&#xff0c;在进行具体指向操作…

【陕西理工大学-数学软件实训】数学实验报告(8)(数值微积分与方程数值求解)

目录 一、实验目的 二、实验要求 三、实验内容与结果 四、实验心得 一、实验目的 1. 掌握求数值导数和数值积分的方法。 2. 掌握代数方程数值求解的方法。 3. 掌握常微分方程数值求解的方法。 二、实验要求 1. 根据实验内容&#xff0c;编写相应的MATLAB程序&#xff0c…

Java IO 之 BIO、NIO 和 AIO

一、IO IO 是 Input 和 Output 二词的缩写&#xff0c;意为输入和输出&#xff0c;直接来说&#xff0c;实现一般的 I/O 是没有什么难度的&#xff0c;但涉及到多线程时&#xff0c;要解决 I/O 的问题就不是一个简单的事情了&#xff0c;会涉及到同步和异步的问题&#xff0c;…

SSL加速是什么,有什么优势?

SSL加速技术是一种专门用于加速HTTPS通信的技术&#xff0c;它可以在服务器和客户端之间提供高效的加密和解密处理&#xff0c;以提升网络通信的安全性和性能。以下是SSL加速技术的一些主要优势&#xff1a; 提高网站的访问速度&#xff1a;SSL加速技术可以对SSL握手过程进行优…

1143. 最长公共子序列(C++实现)

1143. 最长公共子序列https://leetcode.cn/problems/longest-common-subsequence/ int longestCommonSubsequence(string text1, string text2) {int m text1.size(), n text2.size();vector<vector<int>> dp(m 1, vector<int>(n 1));for (int i 0; i …

C++文件操作示例

C 标准库提供了 3 个类用于实现文件操作&#xff0c;它们统称为文件流类&#xff0c;这 3 个类分别为&#xff1a; ifstream&#xff1a;专用于从文件读取数据 ofstream&#xff1a;专用于向文件写入数据 fstream&#xff1a;可读可写 这三个文件流类都位于 fstrea…

NSS [HNCTF 2022 WEEK2]easy_sql

NSS [HNCTF 2022 WEEK2]easy_sql 这题考察了无列名注入&#xff0c;首先了解一下什么是无列名注入再开始做题吧。 为什么会需要无列名注入&#xff1f; 我们常用的SQL注入方法是通过information_schema这个默认数据库来实现&#xff0c;可是你有没有想过&#xff0c;如果过滤…

下载github中单独某个子文件方法

在github中下载文件有很多方法&#xff0c;比如整体打包下载&#xff0c;单独小文件下载。我分享一个怎样下载某个单独文件夹方法。 在下载这个E文件夹时候&#xff0c;复制当前的url。 然后找到一个工具网页&#xff1a;DownGit 然后就可以下载文件夹的压缩文件了。

【机器学习】TF-IDF以及TfidfVectorizer

TF-IDF定义 TF-IDF&#xff1a; 全称为"词频一逆文档频率"。   TF&#xff1a;某一给定词语在该文档中出现的频率。 T F w 词语 w 在该文档中个数 该文档内总词个数 TF_w \frac{词语w在该文档中个数}{该文档内总词个数} TFw​该文档内总词个数词语w在该文档中个…

FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地

FreeSWITCH 1.10.10 简单图形化界面9 - 鼎兴FXO网关SIP中继内网IPPBX落地 0、 界面预览1、创建一个话务台2、创建PBX SIP中继并设置呼入权限3、设置呼出规则4、设置分机呼出权限5、设置FXO 网关相关信息6、设置FXO网关端口组呼入号码7、设置FXO网关的SIP中继8、设置FXO网关呼叫…

第二章 进程与线程 十、调度算法1(先来先服务、短作业优先、最高响应比优先)

目录 一、先来先服务算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺点 优点&#xff1a; 缺点&#xff1a; 6、是否会导致饥饿 7、例子 二、短作业优先算法 1、算法思想 2、算法规则 3、用于作业/进程调度 4、是否可抢占? 5、优缺…

Linux多线程【线程控制】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、线程知识补充1.2、线程私有资源1.3、线程共享资源1.4、原生线程库 2、线程…