我正在努力让我的数据库与我的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.<init>(ConnectionImpl.java:787)
at com.mysql.jdbc.JDBC4Connection.<init>(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.<init>(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.<init>(Socket.java:375)
at java.net.Socket.<init>(Socket.java:218)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
at com.mysql.jdbc.MysqlIO.<init>(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?");
}
}
29 回答
所以,你有一个
我引用了this answer,其中还包含一步一步的MySQL JDBC教程:
另见:
How should I connect to JDBC database / datasource in a servlet based application?
Is it safe to use a static java.sql.Connection instance in a multithreaded system?
当Java出堆时我 grab 了这个异常 . 如果我尝试在RAM中放入许多数据项 - 首先我 grab “ Communications link failure " and next " OutOfMemoryError ” .
我记录了它,我减少了内存消耗(删除1/2数据),一切正常 .
如果数据库连接长时间处于空闲状态,则会发生
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
异常 .这个空闲连接在
connection.isClosed();
上返回true,但如果我们尝试执行语句,那么它将触发此异常,因此我建议使用数据库池 .我可能在这里咆哮错误的树,但你的异常似乎表明你的MySQL服务器不可用 .
如果你尝试(从终端)会发生什么
系统将提示您输入与用户名关联的密码 . 你提供正确的密码后,mysql客户端连接?
如果没有,您可能必须从首选项启动MySQL . 您也可以将其设置为在启动时运行 .
几个小时我一直有同样的问题 . 我正在使用MAMP服务器
而不是使用localhost:[Apache Port],使用您的MySQL端口 .
以下是MAMP服务器的默认MySQL端口 .
这是最好的解决方案,
将Localhost替换为您的IP地址
从Mysql下载MySQL-JDBC-Type-4-Treiber(例如'mysql-connector-java-5.1.11-bin.jar',来自'mysql-connector-java-5.1.11.zip') .
您需要在类路径的编译和运行时期间插入驱动程序jar .
我得到了同样的错误,因为我试图在没有启动mysql服务器的情况下运行我的程序 .
启动mysql服务器后,一切正常 .
在我的情况下,结果是
mysql-connector-java
的版本很高 .在我的演示中,我以某种方式使用_1169721这样:
但在开发环境中,我使用这个:
我的MySQL版本是5.1.48(是的,它很老,仅仅是为了模仿产品版本) . 所以我遇到了同样的错误 .
由于找到了原因,因此也找到了解决方案 . 匹配版本!
请在/etc/mysql/my.cnf文件中更新您的IP地址
重启mysql deamon和mysql服务 .
早期的答案是恰当的 . 但是,我还想指出一个更普遍的问题 .
我遇到了类似的问题,原因是我公司的网络限制 .
当我在任何其他网络时,相同的连接获得成功 .
刚刚经历过这个 .
必须使它工作:(这可以放在静态块初始化器中)
通过以下方式获得连接:
而不是指定登录参数
问候 .
如果您正在使用
WAMP
或XAMP
服务器安装mysql数据库 . 然后你必须显式启动mysql服务器,否则它将在连接数据库时显示com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
我的同样问题通过以下步骤解决:
vi /etc/mysql/my.cnf
"#bind-address = 127.0.0.1"
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”请检查您的端口号
For Remote Call to Mysql
我有同样的问题,这是如何解决的:
我的.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
的输出:MySQL服务器没有响应 .
当然,请确保您的MySQL服务器正在运行 .
也许你没有启动你的Mysql和Apache服务器 . 从XAMPP控制面板启动Apache服务器和Mysql后,连接成功 Build .
祝好运!
为我解决的是做两件事:1 . 使用以下connads创建除root之外的新用户:
2.在mysqld.conf上注释IP地址行
然后用新的用户名和密码连接 . 它应该工作 .
它试图连接到旧版本的MySQL('version','5.1.73');当您使用较新的驱动程序版本时,您会收到一条错误消息,告诉您使用 "com.mysql.cj.jdbc.Driver ,甚至您不必指定使用哪一个:
我更改了声明,使用了5.1.38版本的mysql-connector-java,在代码中,我保留了 com.mysql.jdbc.Driver .
一切都是在我看到Ankit Jain的answer时开始的
我的防火墙阻止了我的MySQL监听的帖子3307 . 所以我将端口从3307更改为3306.然后我可以成功连接到数据库 .
在我的MacBook中,我只有在重新安装新版本的eclipse EE并删除本地服务器(如xamp mysql或mamp)时才解决此错误,但只使用其中一个...
我在开始申请时遇到了同样的问题,
问题是在mysql文件 /etc/mysql/mysql.conf.d/mysqld.cnf 中,配置就是这样
因此我们可以看到绑定地址指向127.0.0.1,所以为了启动应用程序,一个简单的解决方案是我们可以使用 jdbc:mysql://127.0.0.1:3306/pizzeria 而不是 jdbc:mysql://localhost:3306/pizzeria 将mysql连接到应用程序或另一个解决方案就是你可以检查并将mysql配置更改为default.Both解决方案可以工作 . 我希望它对你们也有用 .
打开文件/etc/mysql/my.cnf:从下面更改参数
bind-address = 127.0.0.1 to bind-address = 192.168.0.3 #this is your local system IP Address
,在mysql中运行以下命令以获取特定的IP地址 - >
如果要授予对所有IP地址的访问权限,请运行以下命令:
如果有任何读者在访问远程服务器时遇到此问题:请确保端口已打开