SQL数据库和Java

时间:2014-04-01 12:25:11

标签: java mysql sql jdbc

我在这里阅读了很多关于如何从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)

我认为这是由错误的端口引起的。这是对的吗?

当我使用我假设的端口是正确的端口时,我没有得到任何错误,但程序只是无休止地运行而且不会产生任何结果。

感谢您的帮助!

5 个答案:

答案 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数据库。但它位于阻止我通信的服务器上。不幸的是,这没有写入服务器的日志文件。

谢谢你们的帮助!