栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java

我的两个程序都遇到了相同的问题。我的错误是这样的:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failureThe last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

我花了几天时间解决这个问题。我已经测试了不同网站中提到的许多方法,但是没有一种有效。最后,我更改了代码,找出了问题所在。我将尝试向你介绍不同的方法,并在此处进行总结。

当我在互联网上寻找该错误的解决方案时,我发现有许多解决方案至少对一个人有用,但其他人则说这对他们不起作用! 为什么有很多方法可以解决此错误? 似乎在连接到服务器时出现问题通常会发生此错误。可能是因为错误的查询字符串或与数据库的连接过多。

因此,我建议你一个接一个地尝试所有解决方案,不要放弃!

这是我在互联网上找到的解决方案,对于每个解决方案,至少都有人用该解决方案解决了他的问题。

提示:对于需要更改MySQL设置的解决方案,可以参考以下文件:

  • Linux:/etc/mysql/my.cnf或/etc/my.cnf(取决于Linux发行版和使用的MySQL软件包)

  • Windows:C: ProgramData MySQL MySQL Server 5.6 my.ini(请注意,它是ProgramData,而不是Program Files)

以下是解决方案:

  • 更改“绑定地址”属性
    取消注释“绑定地址”属性或将其更改为以下IP之一:

bind-address =“ 127.0.0.1”

要么

绑定地址=“ 0.0.0.0”

  • 注释掉“跳过网络”

如果你的MySQL配置文件中有“跳过网络”行,请在该行的开头添加“#”号使其成为注释。

  • 更改“ wait_timeout”和“ interactive_timeout”

将这些行添加到MySQL配置文件中:

wait_timeout
= 数字

Interactive_timeout
= 数字

connect_timeout
= 数字

  • 确保Java不会将’localhost’转换为[::: 1],而不是[127.0.0.1]

由于MySQL可以识别127.0.0.1(IPv4)但不能识别::: 1(IPv6)

可以通过使用以下两种方法之一来避免这种情况:

选项#1:在连接字符串中使用127.0.0.1代替localhost,以避免将localhost转换为::: 1

选项#2:使用选项-Djava.net.preferIPv4Stack = true运行Java,以强制Java使用IPv4而不是IPv6。在Linux上,也可以通过运行(或将其放在/ etc / profile中:

export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
  • 检查操作系统代理设置,防火墙和防病毒程序

确保防火墙或防病毒软件没有阻止MySQL服务。

在Linux上暂时停止iptables。如果iptables配置错误,它们可能允许将tcp数据包发送到mysql端口,但阻止tcp数据包通过同一连接返回。

# Redhat enterprise and CentOSsystemctl stop iptables.service# Other linux distrosservice iptables stop

在Windows上停止防病毒软件。

  • 更改连接字符串

检查你的查询字符串。你的连接字符串应该是这样的:

dbName = "my_database";dbUserName = "root";dbPassword = "";String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnipre=true&characterEncoding=UTF-8";

确保你的字符串中没有空格。所有连接字符串应继续,且不包含任何空格字符。

尝试用回送地址127.0.0.1替换“ localhost”。也尝试将端口号添加到你的连接字符串中,例如:

String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnipre=true&characterEncoding=UTF-8";

通常,MySQL的默认端口是3306。

不要忘记将用户名和密码更改为MySQL服务器的用户名和密码。

  • 更新你的JDK驱动程序库文件
  • 测试不同的JDK和JRE(例如JDK 6和7)
  • 不要更改max_allowed_pa​​cket

“ max_allowed_pa​​cket ”
是MySQL配置文件中的一个变量,指示最大包大小,而不是最大包数。因此,这无助于解决此错误。

  • 更改tomcat的安全性

将TOMCAT6_SECURITY =是更改为TOMCAT6_SECURITY =否

  • 使用validationQuery属性

使用validationQuery =“ select now()”确保每个查询都有响应

  • 自动重新连接

将此代码添加到你的连接字符串中:

&autoReconnect=true&failOverReadonly=false&maxReconnects=10

尽管这些解决方案都不适合我,但我建议你尝试一下。因为有些人按照以下步骤解决了他们的问题。

但是什么解决了我的问题?

我的问题是我在数据库上有很多SELECT。每次创建连接然后关闭它时。尽管我每次都关闭连接,但是系统面临许多连接,并给了我这个错误。我所做的是将连接变量定义为整个类的公共(或私有)变量,并在构造函数中对其进行了初始化。然后每次我只是使用那个连接。它解决了我的问题,也大大提高了我的速度。

结论

没有简单独特的方法可以解决此问题。我建议你考虑自己的情况并选择上述解决方案。如果在程序开始时出现此错误,并且根本无法连接到数据库,则连接字符串可能有问题。但是,如果在几次成功与数据库交互之后遇到此错误,则问题可能出在连接数上,你可能会考虑更改“ wait_timeout”和其他MySQL设置,或者重写你的代码以减少连接数。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/380640.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号