com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

2023-10-27

我的需求是数据库中有一个表,其字段为,id,词,主题,主题,该词在该主题下出现的概率(LDA生成的内容)。我要为利用数据库中的内容为每一条微博计算其在主题上的概率,于是我需要不停的做select,进行全表扫描。
这里写图片描述
我以id和topic作为联合主键,将type建立了索引。原本是一个txt文件,读入数据库后数据量达到了3600w,所以我有200个主题,就以每五个一个主题一个分表建立了分表,这样查询更加方便,存入数据库的时候也不会因为数据量过大出现各种问题。
在之后的select过程中,遇到了种种问题。
我的微博信息存储在一个txt里面,有很多这样的txt;每个txt中的一行都是一条分好词的微博。我使用了Guava IO来进行读取。
1. 最初我的思路是,拿一条微博查询这条微博中的词在各个主题下的概率,然后写入txt便于我后续处理,get connection,建立一个statement,然后去找结果,之后将resultset读出,写入txt。但是这样速度非常慢;
2. 于是我优化了我的select语句,我使用了order by topic,我将我需要的这条微博里的词的概率一次筛选出来,然后再进行处理。我使用的依旧是statement,但是这样很快就遇到了问题;报错信息如下:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

Last packet sent to the server was 39967 ms ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
    at java.lang.reflect.Constructor.newInstance(Unknown Source)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:353)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1074)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2583)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2871)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1601)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1710)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:2436)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1402)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1556)
    at com.sl.mixmodel.LMModel.getIndexno(LMModel.java:71)
    at com.sl.mixmodel.LMModel.main(LMModel.java:30)
Caused by: java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:113)
    at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:160)
    at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:188)
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1955)
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2372)
    ... 8 more
Exception in thread "main" java.lang.NullPointerException
    at com.sl.mixmodel.LMModel.getIndexno(LMModel.java:79)
    at com.sl.mixmodel.LMModel.main(LMModel.java:30)


这个就是传说中的Connection reset问题,出现这个问题之后,数据库链接被耗尽,只有重启才能再使用mysql,但是再次运行程序,依旧是这个问题。我在百度上搜索了好几天,也找不到这个问题的答案。我看到了stackflow上的回答:
http://stackoverflow.com/questions/6865538/solving-a-communications-link-failure-with-jdbc-and-mysql
出现这个问题的原因有很多:
1. 如果你收到这个包的时间是0ms,那么你的数据库连接是有问题的,更多的是网络问题导致没有连接上数据库,你需要检查你的端口号,连接名,检查bind-address;
2. 如果你是运行了一段时间之后才出现问题,那你的问题就和我比较类似了,是因为大量的查询导致了mysql那边堵塞,最后那边卡死推出,这边再发送请求来请求数据,就会导致链接重置的问题;
3. 如果你的数据库跑了一夜,导致了该问题的发生,那么你需要通过设置mysql的connection的时间来解决链接重置的问题。
4. 当然也可能是jdk的版本问题,或者你的mysql-connection的包的问题,你需要仔细检查,防止这些小地方出毛病。
于是我又开始了再一次的优化,我使用了preparedstatement,但是由于我要预编译的句子不是固定的,也就是说不能确定那个?有多少个,所以,我简单的以为,我可以直接通过字符串拼接完成这个sql,问题依旧。我觉得问题应该就是mysql那边由于访问被卡死了,我试着来手动清空mysql那边查询到的,并且我已经写完释放的数据,但是并没有这样的方法,都是自己回收的。
我看到了这个,http://www.cnblogs.com/xhan/p/3958521.html,我希望通过分批次的读写,减少resultset读取过来的阻碍,但是依旧没用。
直到今天,我找到了,http://www.importnew.com/5660.html,我才发现我硬性的去预编译一条sql语句效率反而下降了。我修改了mysql的配置,给mysq更多的max connection,保证不会因为链接过多而阻塞退出。

这是我最终的代码:

package com.sl.mixmodel;
import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.List;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;

import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import com.sl.util.DB;

public class LMModel {

    /**
     * @param args
     */
    public static void main(String[] args) {
        LMModel lmmodel = new LMModel();
        Collection<File> c = lmmodel
                .getAllUserResult("E:/myeclipse_workplace_sl/personalizedsearch2/sr/after/");
        Connection conn = DB.getConn();
        for (File f : c) {
            lmmodel.insertIndexno(conn, f,
                    "E:/myeclipse_workplace_sl/personalizedsearch2/sr/"
                            ,f.getName());
        }
        DB.close(conn);
//      Collection<File> files = FileUtils.listFiles(new File("E:/myeclipse_workplace_sl/personalizedsearch2/sr/after/"), null, false);
//      for(File f : files){
//          System.out.println(f.getName());
//          System.out.println(FilenameUtils.getBaseName(f.getAbsolutePath()));
//      }
    }

    public Collection<File> getAllUserResult(String source) {
        Collection<File> c = FileUtils.listFiles(new File(source), null, false);
        return c;
    }

    public void insertIndexno(Connection conn, File f, String bathpath, String filename) {
        List<String> resultlist = null;
        try {
            resultlist = FileUtils.readLines(f);
        } catch (IOException e) {
            e.printStackTrace();
        }
        int rank = 0;
        for (String resultline : resultlist) {
            Splitter splitter = Splitter.on(" ").trimResults();
            List<String> list = splitter.splitToList(resultline);
            Joiner joiner = Joiner.on("','").skipNulls();
            String j = "('" + joiner.join(list) + "')";
            String path = bathpath + FilenameUtils.getBaseName(filename)  + "_" + rank + FilenameUtils.getExtension(filename);
            String sql = "SELECT topic,type,oprop INTO OUTFILE '" + path
                    + "' FROM phi_p WHERE type IN " + j
                    + " ORDER BY topic";
            System.out.println(sql);
            PreparedStatement pstmt = null;
            try {
                pstmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY,
                        ResultSet.CONCUR_READ_ONLY);
            } catch (SQLException e2) {
                e2.printStackTrace();
            }
            ResultSet rs = null;
            try {
                pstmt.setFetchSize(Integer.MIN_VALUE);
                rs = pstmt.executeQuery();
            } catch (SQLException e2) {
                e2.printStackTrace();
            }
            rank++;
            DB.close(rs);
            DB.close(pstmt);
        }
    }

    public void getIndexno(Connection conn, File f, String resultprop) {
        // read the file to list
        File finalprop = new File(resultprop);
        List<String> props = Lists.newArrayList();
        // batch parameters
        List<String> resultlist = null;
        try {
            resultlist = FileUtils.readLines(f);
        } catch (IOException e) {
            e.printStackTrace();
        }
        int rank = 0;
        for (String resultline : resultlist) {
            int linecounter = 0;
            int batchsize = 2000;
            Splitter splitter = Splitter.on(" ").trimResults();
            List<String> list = splitter.splitToList(resultline);
            int listsize = list.size();
            Joiner joiner = Joiner.on("','").skipNulls();
            String j = "('" + joiner.join(list) + "')";
            String s = "?";
            List<String> quotes = Lists.newArrayList();
            for(int i = 0; i < listsize; i++){
                quotes.add(s);
            }
            Joiner forsql = Joiner.on(",");
            String quote = "(" + forsql.join(quotes) + ")";
            String sql = "SELECT topic,type,oprop FROM phi_p WHERE type IN "
                    + quote + " ORDER BY topic";
            PreparedStatement pstmt = null;
            try {
                pstmt = conn.prepareStatement(sql);
                int count = 1;
                for(String str : list){
                    pstmt.setString(count, str);
                    count++;
                }
            } catch (SQLException e3) {
                e3.printStackTrace();
            }
            ResultSet rs = null;
            try {
                rs = pstmt.executeQuery();
            } catch (SQLException e2) {
                e2.printStackTrace();
            }
            // Statement stmt = DB.getStatement(conn);
            // ResultSet rs = DB.getResultSet(stmt, sql);
            try {
                while (rs.next()) {
                    linecounter++;
                    String s2 = rank + " " + rs.getString("topic") + " "
                            + rs.getString("type") + " "
                            + rs.getDouble("oprop");
                    System.out.println(s2);
                    props.add(s2);
                    if (linecounter % batchsize == 0) {
                        try {
                            FileUtils.writeLines(finalprop, props, true);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        props.clear();
                    }
                }
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            if (linecounter % batchsize > 0) {
                try {
                    FileUtils.writeLines(finalprop, props, true);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            props.clear();
            try {
                pstmt.execute("RESET QUERY CACHE");
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rank++;
            DB.close(rs);
            DB.close(pstmt);
        }
    }
}

communication reset以及Communications link failure问题的原因有很多,要看情况而定,分析问题产生的原因,单纯的看那些博客随便搞搞不是办法。现在百度上多数的帖子依旧是设置time_out的方法。
更多的解决方案,请找到自己问题所在,看看这个:http://stackoverflow.com/questions/6865538/solving-a-communications-link-failure-with-jdbc-and-mysql

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 的相关文章

  • 两个日期之间有多少周

    我的数据库 MySQL 中有开始日期和结束日期 我怎样才能得到答案 这两个日期有多少周 或天 mysql 或 php 例如我有这样的数据库 开始并 会停2009 12 17 2009 12 242009 12 12 2009 12 26 更
  • 如何限制 SQLite / MySQL 中的列值

    我想限制表中的列值 例如 列值只能是car or bike or van 我的问题是如何在 SQL 中实现这一点 在数据库端执行此操作是一个好主意还是应该让应用程序限制输入 我还打算在将来添加或删除更多值 例如 truck 我使用的数据库类
  • 如何让MySQL数据库完全在内存中运行?

    我注意到我的数据库服务器支持内存数据库引擎 我想让一个已经运行 InnoDB 的数据库完全在内存中运行以提高性能 我怎么做 我探索了 PHPMyAdmin 但找不到 更改引擎 功能 假设您了解注释中提到的使用 MEMORY 引擎的后果 并且
  • 为 Codeigniter 中的 foreach() 提供的参数无效

    我收到错误消息 我的视图中 foreach 的参数无效 我想显示 mysql 表中的所有条目 但我不断收到错误消息 我是 Codeigniter 的新手 无法真正弄清楚如何解决这个问题 代码如下 我的模型 display branch ph
  • 在MySQL中永久设置auto_increment_offset

    我以 root 身份运行命令 set auto increment offset 2 但从其他连接上看不到效果 为什么不 它是全球性的 From http dev mysql com doc refman 5 1 en replicatio
  • Node.js - 我可以在 PhoneGap / Cordova 应用程序上安装 NPM 包吗?

    感谢 Cordova 我正在构建一个移动应用程序 并且由于 Cordova 基于 Node js 我认为我可以在应用程序中使用 NPM 包 例如 我希望我的移动应用程序能够与远程 MySQL 数据库通信 我想我可以使用 mysql NPM
  • 两个表之间可以有两种关系吗?

    有两个表 EMPLOYER 和 EMPLOYEE 由于每个 EMPLOYEE 都被分配给一个 EMPLOYER 因此他们之间存在 1 N 关系 简单的事情 但我也希望能够模拟一种情况 每个雇主都可以选择他的one最喜欢的员工 他最好什么也不
  • 我是否应该标准化我的数据库?

    在设计数据库 例如 MySQL 的模式时 会出现是否完全规范化表的问题 一方面 连接 以及外键约束等 非常慢 另一方面 您会获得冗余数据和潜在的不一致 最后优化 是正确的方法吗 即创建一个按书本规范化的数据库 然后查看可以对哪些内容进行非规
  • 如何在 Eclipse 中使用 MySql 数据库

    我对编程非常陌生 所以请耐心等待 如果一开始我没有理解的话 请提前道歉 我正在做一个本科编程项目 需要在 Java 程序中创建一些数据库 我正在使用 eclipse galilo 来编写我的程序 我已经下载了一个连接器 J 但还不知道应该如
  • 使用存储过程并发访问MySQL数据库

    我有一个存储过程 它将读取然后增加数据库中的值 许多程序同时使用这个特定的过程 我担心并发问题 特别是读写器问题 有人可以建议我任何可能的解决方案吗 thanks 首先 正如另一篇文章中所述 使用 InnoDB 从 MySQL 5 5 开始
  • 提交ajax表单并停留在同一页面不起作用

    我想将用户的评论存储在我的数据库中 当用户提交时 我不想将他们重定向到新页面 我有以下代码 但它不起作用 我的 HTML 代码
  • 保存用户的身高和体重

    我应该如何将用户的身高和体重存储在MySQL数据库中 以便我可以使用这些信息来查找特定身高或体重内的用户 另外 我需要能够以英制或公制显示此信息 我的想法是存储以厘米为单位的身高和以公斤为单位的体重信息 我更喜欢公制而不是英制 我什至可以让
  • 如何使用Conda安装MySQLdb?

    我已经阅读了有关如何安装 MySQLdb 的几种不同的解释 但我不确定哪种情况适用于我 因为我的错误消息不同 我的系统似乎找不到 MySQLdb 我安装了 pymysql 但我需要导入 MySQLdb 才能使用该库中的过程 感谢您的帮助 c
  • MySQL 多个 IN 条件对同一个表进行子查询

    我有多个带有子查询的 IN 条件 SELECT S name S email FROM something S WHERE 1 NOT IN SELECT id FROM tags WHERE somethingId S id AND 2
  • PHP/MySQL:检索邻接列表模型中的单个路径

    有没有什么有效的方法可以在不限制深度的情况下根据节点的ID检索邻接列表模型中的单个路径 就像如果我有一个名为 Banana 的节点的 ID 我可以获得以下路径 Food gt Fruits gt Banana 如果不可能的话也不是什么大问题
  • 数据太长,导致列错误(包含国家字符)

    我必须移植一些DBS变成独立的MySQL版本 5 0 18运行于Windows 7 64 位我遇到了一个困扰我的问题 如果我尝试将任何国家 Unicode 字符插入varchar我收到错误 ERROR 1406 22001 Data too
  • 我应该为 MySQL 使用什么 python 3 库? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 据我所知 MySQLdb 仍然没有移植到 Python 3 pypy 上似乎有另一个名为 PyMySQL
  • ON DUPLICATE KEY UPDATE 的自动增量过多

    我有一个包含列的基本表 id 主要是AI 名称 唯一 etc 如果唯一列不存在 则插入该行 否则更新该行 INSERT INTO pages name etc VALUES bob randomness ON DUPLICATE KEY U
  • 从多个选择列表中插入数据到mysql数据库(html形式)

    我制作了一个表格 其中有商店的 ID
  • 我的数据库有错误

    创建表时如下 create table Ticket ticket id integer not null primary key AirlineName varchar not null CustomerName varchar from

随机推荐

  • openpose pytorch代码分析

    github https github com tensorboy pytorch Realtime Multi Person Pose Estimation 1 coding utf 8 2 import os 3 import re 4
  • 原型设计工具——axure认识与使用

    一 Axure认识 1 1 什么是Axure 发音 Ack sure Axure RP是一个专业的快速原型设计工具 是一个专业的快速原型设计工具 让负责定义需求和规格 设计功能和界面的专家能够快速创建应用软件或Web网站的线框图 流程图 原
  • 激活函数之softmax函数

    1 softmax函数 分类问题中使用的 softmax 函数可以用下面的式表示 exp x 是表示 ex 的指数函数 e 是纳皮尔常数 2 7182 式 3 10 表示假设输出层共有 n 个神经元 计算第 k 个神经元的输出 yk 如式
  • YOLO7 口罩识别实战

    文章目录 1 制作数据集 1 1 安装数据集制作工具 1 2 运行数据集制作工具 1 3 制作数据集 2 使用数据集 2 1 下载口罩数据集 2 2 分割数据集 2 3 数据集配置 3 训练模型 3 1 下载预训练模型 3 2 修改训练代码
  • 经典遗传算法及MATLAB实例

    经典遗传算法及简单实例 MATLAB 1 遗传算法简单介绍 1 1 理论基础 1 2 算法要点 1 1 编码 1 2 适应度函数 1 3 基本流程 2 代码实例 MATLAB 2 1 代码汇总 2 1 初始化种群 2 2 计算适应度 2 3
  • IntelliJ IDEA 好用插件之Maven Helper

    习惯使用spring官方ide sts的我 切换到idea之后各种不适应 maven项目在sts中查找maven依赖那是相当方便 可显示依赖结构 可以查找 处理依赖冲突很方便 在IDEA中只有让人一脸懵逼的线条图 还好有了Maven Hel
  • centos挂载U盘失败no valid journal superblock found EXT4-fs (sda): error loading journal

    执行一行命令搞定 mke2fs t ext4 O has journal dev sdX 这里的 dev sdX是你的U盘地址 我这里是 dev sda
  • 软件工程-----层次图

    层次图 什么是层次图 层次图是一种图形化的表示方法 用于展示一个系统或组织的层次结构 它通常由一个根节点开始 然后分支出多个子节点 每个子节点又可以有自己的子节点 以此类推 层次图可以帮助人们更好地理解系统或组织的结构和关系 为什么要用层次
  • 细说vue的过渡动画

    在vue中 实现过渡动画一般是下面这样
  • 关于keil警告/错误问题的解释和修正

    关于keil警告 错误问题的解释和修正 版权声明 本文为博主 乔小白 一字一句敲出来的原创作品 未经博主允许不得转载 多谢支持 本系列博客仅做经验交流分享 不能用作任何商业用途 本文中如有不足之处 请留言 本人将及时更改 本文持续更新 请利
  • 机器学习降维算法三:LLE (Locally Linear Embedding) 局部线性嵌入

    机器学习降维算法三 LLE Locally Linear Embedding 局部线性嵌入 https www cnblogs com xbinworld archive 2012 07 09 LLE html https segmentf
  • 【读点论文】EfficientFormer: Vision Transformers at MobileNet Speed,运用纯transformer架构对比卷积模型在终端上部署的推理速度

    EfficientFormer Vision Transformers at MobileNet Speed Abstract 视觉transformer ViT 在计算机视觉任务中取得了快速的进展 在各种基准上取得了有前景的结果 然而 由
  • AC220V电压检测电路,一个光耦搞定

    需要检测220V交流电 通和断两种状态 用mcu识别出来 现在220V AC全波检测电路 只需要一个光耦就可以了 R1很重要一定要用大功率的 并且阻值尽可能大 取100K 330K都可以 因为R1在这里限流作用 如果去掉 光耦很容易损坏 当
  • 【npm WARN saveError ENOENT: no such file or directory, open ‘C:\Users\xxx\package.json‘】

    npm WARN saveError ENOENT no such file or directory open C Users xxx package json 一 所遇问题 操作npm过程中遇到提示 npm WARN saveError
  • 结构体与类的字节对齐(终极方案,简单易懂)

    先记住常用类型在32和64位的字节 类型 32位 64位 char 1 1 int 4 4 short 2 2 float 4 4 double 8 8 指针 4 8 只有指针在64位时不同 是8 函数指针的typedef声明不参与计算 枚
  • coco数据集 解析下载

    目录 coco2017数据集 百度云链接 标签 预测的时候没有background coco2017数据集 百度云链接 数据集包括train数据 val验证数据集 test验证数据集 物体检测和keypoints身体关键点的检测 链接 ht
  • 结构体字节填充细节

    1 unsigned char和unsigned short两种类型的变量字节大小跟机器类型无关 分别占1B 2B 但unsigned long类型的变量字节大小与机器类型有关 等于机器字长 为了加快CPU执行效率 结构体会有字节填充 填充
  • vscode 配置 python3开发环境

    转载自 https blog csdn net weixin 40528417 article details 81141567
  • sojson JS 逆向二 (免费版)

    背景 现在市面上很多web网页都是使用sojson加密的 所以 爬虫小伙伴对sojson的学习迫在眉睫 js 加密源码 var a b function w d w info 这是一个一系列js操作 d warning 如果您的JS里嵌套了
  • com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

    我的需求是数据库中有一个表 其字段为 id 词 主题 主题 该词在该主题下出现的概率 LDA生成的内容 我要为利用数据库中的内容为每一条微博计算其在主题上的概率 于是我需要不停的做select 进行全表扫描 我以id和topic作为联合主键