com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败

我正在努力让我的数据库与我的Java程序交谈。

有人可以使用JDBC给我一个快速而又脏的示例程序吗?

我收到了一个相当惊人的错误:

Exception in thread "main" 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:409) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2260) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:787) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:49) 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:409) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:357) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285) at java.sql.DriverManager.getConnection(DriverManager.java:582) at java.sql.DriverManager.getConnection(DriverManager.java:207) at SqlTest.main(SqlTest.java:22) Caused by: 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:409) at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1122) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:344) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2181) ... 12 more Caused by: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432) at java.net.Socket.connect(Socket.java:529) at java.net.Socket.connect(Socket.java:478) at java.net.Socket.(Socket.java:375) at java.net.Socket.(Socket.java:218) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:293) ... 13 more 

测试文件的内容:

 import com.mysql.jdbc.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class SqlTest { public static void main(String [] args) throws Exception { // Class.forName( "com.mysql.jdbc.Driver" ); // do this in init // // edit the jdbc url Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123"); // Statement st = conn.createStatement(); // ResultSet rs = st.executeQuery( "select * from table" ); System.out.println("Connected?"); } } 

所以,你有一个

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链接失败
java.net.ConnectException:连接被拒绝

我引用了这个答案 ,其中还包含一步一步的MySQL + JDBC教程:

如果您收到SQLException: Connection refusedConnection timed out或MySQL特定的CommunicationsException: Communications link failure ,则表示根本无法访问数据库。 这可能有以下一个或多个原因:

  1. JDBC URL中的IP地址或主机名是错误的。
  2. 本地DNS服务器无法识别JDBC URL中的主机名。
  3. JDBC URL中的端口号丢失或错误。
  4. 数据库服务器已关闭。
  5. 数据库服务器不接受TCP / IP连接。
  6. 数据库服务器已用完连接。
  7. Java和DB之间的某些东西阻止了连接,例如防火墙或代理。

要解决这个问题,请遵循以下建议:

  1. 使用pingvalidation并测试它们。
  2. 刷新DNS或使用JDBC URL中的IP地址。
  3. 根据MySQL DB的my.cnf进行validation。
  4. 启动数据库。
  5. validationmysqld是否在没有--skip-networking option情况下启动。
  6. 重新启动数据库并相应地修复代码,以便最终关闭连接。
  7. 禁用防火墙和/或配置防火墙/代理以允许/转发端口。

也可以看看:

  • 我应该如何连接到基于servlet的应用程序中的JDBC数据库/数据源?
  • 在multithreading系统中使用静态java.sql.Connection实例是否安全?

当Java出堆时我抓住了这个exception。 如果我尝试在RAM中放入许多数据项 – 首先我捕获“ 通信链接失败 ”和下一个“ OutOfMemoryError ”。

我记录了它,我减少了内存消耗(删除1/2数据),一切正常。

如果数据库连接长时间处于空闲状态,则会发生此com.mysql.jdbc.exceptions.jdbc4.CommunicationsExceptionexception。

此idle连接在connection.isClosed();上返回true connection.isClosed(); 但是如果我们尝试执行语句,那么它将触发此exception,因此我建议使用数据库池。

我可能在这里咆哮错误的树,但你的exception似乎表明你的MySQL服务器不可用。

线程“main”中的exceptioncom.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障成功发送到服务器的最后一个数据包是0毫秒前。 驱动程序未收到来自服务器的任何数据包。 在…

如果你尝试(从终端)会发生什么

 mysql -u username -p 

系统将提示您输入与用户名关联的密码。 你给出正确的密码后mysql客户端连接?

如果不是,您可能必须从首选项启动MySQL。 您也可以将其设置为在启动时运行。

几个小时我一直有同样的问题。 我正在使用MAMP服务器

而不是使用localhost:[Apache Port],使用您的MySQL端口。

以下是MAMP服务器的默认MySQL端口。

 String url = "jdbc:mysql://localhost:8889/db_name"; Connection conn = DriverManager.getConnection(url, dbUsername, dbPassword); 

这是最好的解决方案,

  Connection con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/DBname", "root", "root"); Connection con = DriverManager.getConnection( "jdbc:mysql://192.100.0.000:3306/DBname", "root", "root"); 

将Localhost替换为您的IP地址

在Mysql下载MySQL-JDBC-Type-4-Treiber(来自’mysql-connector-java-5.1.11.zip’的ig’mysql-connector-java-5.1.11-bin.jar’)。

您需要在类路径的编译和运行时期间插入驱动程序jar。

 Class.forName( "com.mysql.jdbc.Driver" ); // do this in init // edit the jdbc url Connection conn = DriverManager.getConnection( "jdbc:mysql://MyDbComputerNameOrIP:3306/myDatabaseName", username, password ); Statement st = conn.createStatement(); ResultSet rs = st.executeQuery( "select * from table" ); 

我得到了同样的错误,因为我试图在没有启动mysql服务器的情况下运行我的程序。

启动mysql服务器后,一切顺利。

在我的情况下,结果是mysql-connector-java的版本很高。

在我的演示中,我以某种方式使用mysql-connector-java如下所示:

  mysql mysql-connector-java 5.1.9  

但在开发环境中,我使用这个:

  mysql mysql-connector-java 5.1.31  

我的MySQL版本是5.1.48(是的,它很旧,只是为了模仿产品版本)。 所以我遇到了同样的错误。

由于找到了原因,因此也找到了解决方案。 匹配版本!

请在/etc/mysql/my.cnf文件中更新您的IP地址

 bind-address =  

重启mysql deamon和mysql服务。

早期的答案是恰当的。 但是,我还想指出一个更通用的问题。

我遇到了类似的问题,原因是我公司的网络限制。

当我在任何其他网络时,相同的连接获得成功。

刚刚经历过这个。

必须使它工作:(这可以放在静态块初始化器中)

 static{ // would have to be surrounded by try catch Class.forName("com.mysql.jdbc.Driver"); // this will load the class Driver } 

通过以下方式获得连接:

 conn = DriverManager.getConnection(DBURL,,); 

而不是指定登录参数

  Connection conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/projects?user=user1&password=123"); 

问候。

如果您使用WAMPXAMP服务器来安装mysql数据库。 然后你必须显式启动mysql服务器,否则它将显示com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure连接数据库时com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

我的同样问题通过以下步骤解决:

  1. 去my.cnf

    vi /etc/mysql/my.cnf

  2. 修改其绑定地址

    "#bind-address = 127.0.0.1"

  3. 重启mysql

    sudo /etc/init.d/mysql restart

我以一种简单的方式解决了这个问题,这对我有用。 我有seme问题“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure”。 在我的db.properties文件中我有这个:url:jdbc:mysql:// localhost:90 / myDB,只删除了端口url,导致这种方式url:jdbc:mysql:// localhost / myDB,这对我有用。

当我在my.ini和php.ini文件中将mysql端口从3306更改为3307但是在更改端口(3307-> 3306)之后它再次正常工作时,这件事发生在我身上。

如果您更改了端口,则会出现此类错误“com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure”请检查您的端口号

我有同样的问题,这是如何解决的:

  1. 我的.jsp正在调用我尚未在servlet中定义的属性。
  2. 我有两个列名称,我通过ResultSet (getString("columnName"))传递给一个对象,它与我的数据库中的列名不匹配。

我不确定哪一个解决了这个问题,但它确实奏效了。 此外,请确保为每个表查询创建新的StatementResultSet

这可能是一个简单的jar问题。 您可能正在使用当前mysql版本不支持的旧mysql-connector-java-XXX-bin.jar 。 我使用mysql-connector-java-5.1.18-bin.jar因为我使用的是mysql 5.5 ,这个问题已经解决了。

尝试将localhost更改为127.0.0.1

localhost将被解析为::1 。 默认情况下,MySQL无法通过IPv6连接。

这是telnet localhost 3306的输出:

 $ telnet localhost 3306 Trying ::1... 

并且MySQL服务器没有响应。

当然,请确保您的MySQL服务器正在运行。

为我解决的是做两件事:1。使用以下connads创建除root之外的新用户:

 CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON *.* TO 'newuser'@'localhost'; FLUSH PRIVILEGES; 

2.在mysqld.conf上注释IP地址行

然后用新的用户名和密码连接。 它应该工作。

它试图连接到旧版本的MySQL(’version’,’5.1.73’); 当您使用较新的驱动程序版本时,您会收到一条错误消息,告诉您使用“com.mysql.cj.jdbc.Driver ,甚至您不必指定您使用的驱动程序:

加载类com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.jdbc.Driver'. This is deprecated. The new driver class is com.mysql.cj.jdbc.Driver’。 驱动程序通过SPI自动注册,通常不需要手动加载驱动程序类。

我更改了声明,使用了5.1.38版本的mysql-connector-java,在代码中,我保留了com.mysql.jdbc.Driver

  mysql mysql-connector-java 5.1.38  

一切都是在我看到Ankit Jain的回答时开始的

我的防火墙阻止了我的MySQL监听的post3307。 所以我将端口从3307更改为3306.然后我可以成功连接到数据库。

如果有任何读者在访问远程服务器时遇到此问题:请确保端口已打开

也许你没有启动你的Mysql和Apache Server。 从XAMPP控制面板启动Apache服务器和Mysql后,连接成功建立。

祝好运!

我在IntelliJ IDEA上遇到了同样的问题。

为解决连接问题,我不得不断开连接(使用mac上的默认键绑定 + F2 )并重新连接。 只是按“刷新”是不够的。