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 refused
或Connection timed out
或MySQL特定的CommunicationsException: Communications link failure
,则表示根本无法访问数据库。 这可能有以下一个或多个原因:
- JDBC URL中的IP地址或主机名是错误的。
- 本地DNS服务器无法识别JDBC URL中的主机名。
- JDBC URL中的端口号丢失或错误。
- 数据库服务器已关闭。
- 数据库服务器不接受TCP / IP连接。
- 数据库服务器已用完连接。
- Java和DB之间的某些东西阻止了连接,例如防火墙或代理。
要解决这个问题,请遵循以下建议:
- 使用
ping
validation并测试它们。- 刷新DNS或使用JDBC URL中的IP地址。
- 根据MySQL DB的
my.cnf
进行validation。- 启动数据库。
- validationmysqld是否在没有
--skip-networking option
情况下启动。- 重新启动数据库并相应地修复代码,以便最终关闭连接。
- 禁用防火墙和/或配置防火墙/代理以允许/转发端口。
也可以看看:
- 我应该如何连接到基于servlet的应用程序中的JDBC数据库/数据源?
- 在multithreading系统中使用静态java.sql.Connection实例是否安全?
当Java出堆时我抓住了这个exception。 如果我尝试在RAM中放入许多数据项 – 首先我捕获“ 通信链接失败 ”和下一个“ OutOfMemoryError ”。
我记录了它,我减少了内存消耗(删除1/2数据),一切正常。
如果数据库连接长时间处于空闲状态,则会发生此com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
exception。
此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");
问候。
如果您使用WAMP
或XAMP
服务器来安装mysql数据库。 然后你必须显式启动mysql服务器,否则它将显示com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
连接数据库时com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
我的同样问题通过以下步骤解决:
-
去my.cnf
vi /etc/mysql/my.cnf
-
修改其绑定地址
"#bind-address = 127.0.0.1"
-
重启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”请检查您的端口号
我有同样的问题,这是如何解决的:
- 我的.jsp正在调用我尚未在servlet中定义的属性。
- 我有两个列名称,我通过
ResultSet (getString("columnName"))
传递给一个对象,它与我的数据库中的列名不匹配。
我不确定哪一个解决了这个问题,但它确实奏效了。 此外,请确保为每个表查询创建新的Statement
和ResultSet
。
这可能是一个简单的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 )并重新连接。 只是按“刷新”是不够的。