用JDBC和MySQL解决“通信链路故障”
我试图连接到本地MySQL服务器,但我不断收到错误。
这是代码。
public class Connect { public static void main(String[] args) { Connection conn = null; try { String userName = "myUsername"; String password = "myPassword"; String url = "jdbc:mysql://localhost:3306/myDatabaseName"; Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = DriverManager.getConnection(url, userName, password); System.out.println("Database connection established"); } catch (Exception e) { System.err.println("Cannot connect to database server"); System.err.println(e.getMessage()); e.printStackTrace(); } finally { if (conn != null) { try { conn.close(); System.out.println("Database Connection Terminated"); } catch (Exception e) {} } } } }
和错误:
Cannot connect to database server Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2333) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2370) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2154) at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792) at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:185) at Connect.main(Connect.java:16) Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at java.net.Socket.connect(Socket.java:478) at java.net.Socket.<init>(Socket.java:375) at java.net.Socket.<init>(Socket.java:218) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257) at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294) ... 15 more
我已经设置了类path,确保my.cnf有跳过networking选项注释掉。
java版本是1.2.0_26(64位)mysql 5.5.14 mysql连接器5.1.17
我确保用户有权访问我的数据库。
我在两个程序中遇到了同样的问题。 我的错误是这样的:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
我花了好几天的时间来解决这个问题。 我testing了很多在不同网站上提到过的方法,但是其中没有一个能够工作。 最后,我改变了我的代码,发现了什么问题。 我会试着告诉你不同的方法, 并在这里总结一下 。
当我在寻找互联网寻找解决这个错误的方法时,我发现有很多解决scheme至less对一个人有用,但是有些人却说这个解决scheme对他们来说不起作用! 为什么这个错误有很多方法? 看起来这个错误通常发生在连接到服务器时出现问题 。 也许问题是由于错误的查询string或太多的连接到数据库。
所以我build议你一个一个尝试所有的解决scheme,不要放弃!
以下是我在互联网上find的解决scheme,对于他们每个人来说,至less有一个人是用他的解决scheme解决了他的问题。
提示:对于需要更改MySQL设置的解决scheme,可以参考以下文件:
-
Linux:/etc/mysql/my.cnf或/etc/my.cnf(取决于所使用的Linux发行版和MySQL包)
-
Windows:C:**程序数据** \ MySQL \ MySQL服务器5.6 \ my.ini(注意它是程序数据,而不是程序文件)
以下是解决scheme:
- 改变“绑定地址”属性
取消注释“绑定地址”属性或将其更改为以下IP之一:
绑定地址=“127.0.0.1”
要么
绑定地址=“0.0.0.0”
- 评论“跳过networking”
如果你的MySQLconfiguration文件中有一个“skip-networking”行,通过在该行的开始处加上“#”符号来进行注释。
- 改变“wait_timeout”和“interactive_timeout”
将这些行添加到MySQLconfiguration文件中:
wait_timeout = 数字
interactive_timeout = 数字
connect_timeout = 数字
- 确保Java不是将“localhost”翻译为[::: 1]而不是[127.0.0.1]
由于MySQL能够识别127.0.0.1(IPv4)而不是::: 1(IPv6)
这可以通过使用以下两种方法之一来避免:
选项#1:在连接string中使用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。 如果iptablesconfiguration错误,它们可能允许将tcp数据包发送到mysql端口,但阻止tcp数据包返回到同一个连接。
# Redhat enterprise and CentOS systemctl stop iptables.service # Other linux distros service iptables stop
在Windows上停止防病毒软件。
- 更改连接string
检查你的查询string。 你的连接string应该是这样的东西:
dbName = "my_database"; dbUserName = "root"; dbPassword = ""; String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
确保你的string中没有空格。 所有的连接string都应该继续,没有任何空格字符。
尝试用环回地址127.0.0.1replace“localhost”。 也尝试添加端口号到您的连接string,如:
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
通常MySQL的默认端口是3306。
不要忘记将用户名和密码更改为MySQL服务器的用户名和密码。
- 更新您的JDK驱动程序库文件
- testing不同的JDK和JRE(如JDK 6和7)
- 不要更改max_allowed_packet
“ max_allowed_packet ”是MySQLconfiguration文件中的一个variables,它表示最大数据包大小,而不是最大数据包数量。 所以这不会有助于解决这个错误。
- 改变tomcat的安全性
将TOMCAT6_SECURITY = yes更改为TOMCAT6_SECURITY = no
- 使用validationQuery属性
使用validationQuery =“select now()”来确保每个查询都有响应
- autoReconnect的
将此代码添加到连接string中:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
虽然没有这些解决scheme为我工作,我build议你去尝试一下。 因为有些人按照这些步骤解决了他们的问题。
但是什么解决了我的问题?
我的问题是,我有很多的数据库select。 每次我创build一个连接,然后closures它。 虽然我每次都closures连接,但系统面临着很多连接,并给了我这个错误。 我所做的是我定义我的连接variables作为整个类的公共(或私人)variables,并在构造函数中初始化它。 然后每次我只是用这个连接。 它解决了我的问题,也大大提高了我的速度。
结论
没有简单而独特的方法来解决这个问题。 我build议你考虑一下自己的情况,select上面的解决scheme。 如果在程序开始时出现此错误,并且根本无法连接到数据库,则连接string中可能有问题。 但是,如果在与数据库成功交互之后出现这个错误,问题可能在于连接数量,您可能会考虑更改“wait_timeout”和其他MySQL设置,或者重新编写代码,以减less连接数量。
如果你正在使用MAMP PRO,这个简单的修复,我真的希望我已经在我开始search互联网的日子之前,已经意识到这一点。 它真的很简单
您只需从MAMP MySQL选项卡中单击“允许networking访问MySQL”。
真的,那就是了。
哦,你可能还是要把你的绑定地址改成0.0.0.0或127.0.0.1(如上面的post所述),但是如果你是MAMP用户,单独单击这个框可能会解决你的问题。
将bind-address
设置为服务器的networkingIP而不是本地主机默认值,并在我的用户上设置权限。
my.cnf文件:
bind-address = 192.168.123.456
MySql控制台:
GRANT ALL PRIVILEGES ON dbname.* to username@'%' IDENTIFIED BY 'password';
正如上面详细的回答所说,这个错误可能是由许多事情引起的。
我也有这个问题。 我的设置是Mac OSX 10.8,使用Ubuntu 12.04的Vagrantpipe理的VirtualBox虚拟机,使用MySQL 5.5.34。
我已经在Vagrantconfiguration文件中正确设置了端口转发。 我可以通过我的Mac和VM内的远程login到MySQL实例。 所以我知道MySQL守护进程正在运行并且可以访问。 但是,当我试图通过JDBC连接,我得到了“通信链路失败”的错误。
在我的情况下,通过编辑/etc/mysql/my.cnf文件解决了这个问题。 具体来说,我注释了“#bind-address = 127.0.0.1”这一行。
在我的情况下,这是一个空闲的超时,导致连接被删除在服务器上。 连接保持开放,但不能长时间使用。 然后客户端重新启动工作,而我相信重新连接也将工作。
一个不错的解决scheme是有一个守护进程/服务来连接ping连接。
就我而言,
-
在
/etc/mysql/my.cnf
更改远程计算机的mysqlconfiguration:将bind-address = 127.0.0.1
改为#bind-address = 127.0.0.1
-
在远程计算机上,使用
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
更改mysql用户权限GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' IDENTIFIED BY 'password';
-
重要:在远程机器上重新启动mysql:
sudo /etc/init.d/mysql restart
对我来说,解决办法是在mysql服务器的conf文件中将参数bind-address =“127.0.0.1”或bind-address =“xxxx”更改为bind-address =“0.0.0.0”。 谢谢。
我刚刚面临同样的问题。 发生这种情况是因为MySQL守护程序被绑定到了机器的IP地址,这是与有权连接@your_machine的用户build立连接所必需的。 在这种情况下,用户应具有连接USER_NAME @ MACHINE_NAME_OR_IP的权限
我想远程访问我的机器,所以我在my.cnf中更改了
bind-address = MY_IP_ADDRESS
至
bind-address = 0.0.0.0
这将允许用户从本地甚至外部(在我的情况下)连接到实例。 如果将MySQL绑定到0.0.0.0,则以下两种权限都可以使用:
USER_NAME@MACHINE_NAME_OR_IP USER_NAME@localhost
如果您遇到了一系列Docker容器的问题 ,请确保您不仅EXPOSE
3306
端口,而且还要从container -p 3306:3306
之外映射端口。 对于docker-compose.yml
:
version: '2' services: mdb: image: mariadb:10.1 ports: - "3306:3306" …
这发生在我没有足够的MySQL内存的情况下。 重新启动修复了它,但是如果是这种情况,请考虑使用更多内存的nachine,或者限制jvms占用的内存
转到控制面板中的Windows服务并启动MySQL服务。 对我来说,它的工作。 当我正在做一个Java EE项目时,我得到了这个错误“通信链接失败”。 我重新启动我的系统,然后它的工作。
之后,即使重新启动我的系统后,我再次得到相同的错误。 然后我试图打开MySQL命令行控制台并用rootlogin,即使这样,它给了我一个错误。
最后,当我从Windows服务启动MySQL服务时,它工作。
有相同的。 删除端口在我的情况帮助,所以我把它留在jdbc:mysql:// localhost /
如果你使用的是hibernate,那么这个错误可能会导致保持打开Session对象的时间比wait_timeout
我在这里为有兴趣的人logging了一个案例。
我find了解决scheme
因为MySQL需要本地主机才能工作。
去/ etc / network / interfaces文件,并确保你在那里设置了localhostconfiguration:
auto lo iface lo inet loopback
现在重新启动networking子系统和MySQL服务:
sudo /etc/init.d/networking restart
sudo /etc/init.d/mysql重新启动
现在就试试
主要是因为mysql客户端和远程mysql服务器连接不好。
在我的情况下,这是因为片状VPN连接。
在phpstorm + vagrant autoReconnect驱动程序选项帮助。
Soheil提供的决议在我的情况下是成功的。
为了澄清,我需要做的唯一的改变是MySQL的服务器configuration;
bind-address = **INSERT-IP-HERE**
我为我的应用程序使用外部MySQL服务器。 这是一个带有MySQL Server 5.5的基本Debian 7.5安装 – 默认configuration。
重要:
始终备份可能修改的任何configuration文件的原始文件。 当作为超级用户提升时,一定要小心。
文件
/etc/mysql/my.cnf
线
bind-address = 192.168.0.103 #127.0.0.1
重新启动您的MySQL服务器服务:
/usr/sbin/service mysql restart
正如你所看到的,我只是提供了服务器的networkingIP,并注释掉了默认条目。 请注意,只要复制和粘贴我的解决scheme不适合你,除非我们的主机有一些奇迹,共享相同的IP。
谢谢@ Soheil
我遇到类似的问题,我的情况的解决scheme是
- 从127.0.0.1更改绑定地址= 0.0.0.0
- 将url的localhost更改为localhost:3306
我感觉到的是我们不应该放弃,我试图从这个post和其他论坛的每一个选项以及…快乐的作品@saurab
我也面临这个问题。
正如Soheilbuild议的,我去了php.ini文件的pathC:\ windows \ php.ini,然后我修改了这个文件中的端口号。
这是在线mysqli.default_port = ……….
所以我改变了我的Java应用程序,因为它在php.ini文件中,现在它可以正常工作。
我知道这是一个古老的线程,但我已经尝试了很多东西,并使用以下方法解决了我的问题。
我正在Windows上开发一个跨平台的应用程序,但要在Linux和Windows服务器上使用。
在两个系统上都安装了名为“jtm”的MySQL数据库。 出于某种原因,在我的代码中,我的数据库名称为“JTM”。 在Windows上,它工作得很好,实际上它在几个Windows系统上飞行。
在Ubuntu上,我得到了一次又一次的错误。 我在代码“jtm”中用正确的大小写来testing它,并且它可以工作。
Linux对于区分大小写的情况显然不那么宽容(正确的话),而Windows则允许这样做。
我现在觉得有些蠢,但是检查一切。 错误信息并不是最好的,但如果你坚持不懈并把事情做好,那么它似乎是可以解决的。
我刚刚重新启动MySQL(从这里提示: https : //stackoverflow.com/a/14238800 ),它解决了这个问题。
我在MacOS(10.10.2)和MySql(5.6.21)通过自制程序安装了同样的问题。
令人困惑的是,我的应用程序连接到数据库的罚款,而另一个没有。
在应用程序尝试了很多东西,抛出exceptioncom.mysql.jdbc.CommunicationsException这个问题的接受的答案build议无济于事,我很惊讶,重新启动MySQL的工作。
我的问题的原因可能是上述链接的答案中提出的以下内容:
你在使用连接池吗? 如果是,则尝试重新启动服务器。 连接池中的连接可能很less处于closures状态。
对于Windows: – 转到开始菜单写,“MySqlserver实例configuration向导”,并重新configuration您的MySQL服务器实例。 希望它能解决你的问题。
经过多年的同样的问题,没有永久性的解决scheme,这是什么解决了它在过去三周(这是无差错操作logging)
设置全局wait_timeout = 3600;
设置全局interactive_timeout = 230400;
如果它适合你,不要忘记使这永久。
在我的情况下(我是一个noob),我正在testing使MySQL与数据库连接的Servlet,其中一个Exception是上面提到的一个。
它使我的头脑摆动了几秒钟,但我意识到这是因为我没有在localhost
启动我的MySQL服务器 。
启动服务器后,问题就解决了。
那么, 检查一下MySQL服务器是否正常运行 。
如果使用本地模拟器,则必须使用IP地址10.0.2.2而不是本地主机来访问本地MySQL服务器。