我在这里阅读了很多关于如何从java连接到mysql数据库的文章。不知何故,这对我不起作用,我无法找出我做错了什么。首先,这是我的代码:
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
class sqltest{
private static int uid = -1;
protected static Connection dbConn = null;
public static void main (String args[]){
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ResultSet rs = null;
try{
dbConn = DriverManager.getConnection("jdbc:mysql://XXX.XXX.XX.XX:XXXX/peXXXXX","XXXXXX","XXXXXX");
PreparedStatement ps = dbConn.prepareStatement("select id from supervisor where username = philipp");
rs = ps.executeQuery();
uid = rs.getInt("id");
}catch(SQLException e){
e.printStackTrace();
}
System.out.println(uid);
}
}
连接详细信息(用户,密码,地址)正确无误。只有一件事我不明白:已经有一个java-web-applet正在建立这样的连接,它没有使用端口(这可能吗?)。 现在这些是我得到的错误: 当我没有使用端口或默认的3306端口时,我收到此错误:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.ConnectException
MESSAGE: Connection timed out: connect
STACKTRACE:
java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:173)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:268)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2745)
at com.mysql.jdbc.Connection.<init>(Connection.java:1553)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at sqltest.main(sqltest.java:27)
** END NESTED EXCEPTION **
Last packet sent to the server was 28 ms ago.-1
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2820)
at com.mysql.jdbc.Connection.<init>(Connection.java:1553)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
at sqltest.main(sqltest.java:27)
我认为这是由错误的端口引起的。这是对的吗?
当我使用我假设的端口是正确的端口时,我没有得到任何错误,但程序只是无休止地运行而且不会产生任何结果。
感谢您的帮助!
答案 0 :(得分:0)
确保您已连接到正确的主机/端口并且可以访问这些主机/端口
要做到这一点,例如打开终端并从同一个中键入telnet <host> <port>
您正在运行Java代码的计算机。
答案 1 :(得分:0)
我对该地址进行了快速在线端口扫描,看起来服务器端没有侦听端口xxxxx
。也许防火墙配置?或者只是停止了服务器/错误的地址。
答案 2 :(得分:0)
是,
错误的端口可能会导致此异常。声明看起来不对。如果表中有超过一百万条记录,您可能需要等待数天。
答案 3 :(得分:0)
由于代码中没有循环,因此无休止地运行似乎非常不寻常。我的猜测是SQL查询需要很长时间。
警告:此代码错误!
PreparedStatement ps = dbConn.prepareStatement("select id from supervisor where username = philipp");
我猜你需要对MySQL进行测试才能确定,但在我使用过的大多数数据库中,像这样的未加引号的字符串文字会引发错误。
此外,查询中的运行时变量应该使用带有预准备语句的绑定变量。
关于连接失败,我想说如果指定正确的端口号会产生与未指定端口号不同的错误,则默认端口号与您使用的端口号不同。这是令人惊讶的。我认为3306是众所周知的MySQL默认端口。我不熟悉这个驱动程序:org.gjt.mm.mysql.Driver
。首先尝试标准的MySQL驱动程序。
接下来,由于使用正确的端口号连接,但你说它位于那里,我的猜测是select id from supervisor where username = philipp
运行时间很长。鉴于我之前说过的内容,我仍然感到惊讶,但您可以尝试自己在MySQL中运行它。打开mysql
命令行客户端并运行它。
如果它也运行缓慢,那么你知道它不是Java问题。做一些调整。也许username
列未编入索引,并且您有数百万行。检查执行计划以确定。
[编辑1] 当程序看起来“停滞”时,一种好的技术是在各个点添加打印语句。我建议放一堆System.out.println调用来查看我们挂起的代码行?这将有助于缩小问题空间。
答案 4 :(得分:0)
好的,这个问题已经回答:
可以从我的大学环境外部联系SQL数据库。但它位于阻止我通信的服务器上。不幸的是,这没有写入服务器的日志文件。
谢谢你们的帮助!