【问题标题】:How to retrieve data from MySQL with Java threads?如何使用 Java 线程从 MySQL 中检索数据?
【发布时间】:2016-08-30 03:29:00
【问题描述】:

我有一个场景,多个客户端连接到一个从 MySQL 表中检索数据的服务器。在这种情况下,它是包含 id、用户名和密码列的用户表。 在服务器端是以下代码:

Server.java(部分代码)

public void run() {
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(client.getInputStream()));
        PrintWriter writer = new PrintWriter(client.getOutputStream(), true);
        writer.println("[type 'bye' to disconnect]");
        String commandType = null, username = null, password = null;
        while (true) {

            String line = reader.readLine();
            String[] parts = line.split(" ");

            for (int i = 0; i < parts.length; i++) {
                commandType = parts[0];
                username = parts[1];
                password = parts[2];
            }

            if (commandType.equals("!login")) {
                if (db.login(username, password)) {
                    writer.println("Welcome");

                } else {
                    writer.println("Wrong credentials");
                }
            }

            if (line.trim().equals("bye")) {
                writer.println("bye!");
                break;
            }

        }
    } catch (Exception e) {
        System.err.println("Exception caught: client disconnected.");
    } finally {
        try {
            client.close();
        } catch (Exception e) {
            ;
        }
    }
}

在 DBManager 类中我有登录方法:

public synchronized boolean login(String username, String password) throws SQLException {
    Connection con = DriverManager.getConnection("jdbc:mysql://localhost/database", "root", "root");

    Statement st = con.createStatement();

    String sql = "SELECT username, password FROM users WHERE username = " + username + " AND password = "
            + password;

    ResultSet rs = st.executeQuery(sql);

    while (rs.next()) {

        String uname, pass;
        uname = rs.getString("username");
        pass = rs.getString("password");

        if (username.equals(uname) && password.equals(pass)) {
            return true;
        }

    }
    rs.close();
    st.close();
    con.close();
    return false;
}

所以,当客户端发送时:

!login admin admin

我可以用

输出命令类型、用户名和密码
writer.println("Client sends commandType: " + commandType + " , username: " + username + " password: " + password);

,但是如果我想检查用户表中是否有 admin admin,客户端会自动断开与服务器的连接,并在服务器端抛出异常:客户端已断开连接。

【问题讨论】:

  • 这也不例外。异常是导致打印该错误消息的原因。请包括异常和堆栈跟踪。
  • 当捕获到异常时,您只需打印“异常捕获:客户端已断开连接。”,然后断开客户端连接。您应该打印真正异常的堆栈跟踪,如下所示。
  • 另外,您的用户名和密码将在最终查询中被错误地转义(缺少引号),这很可能是 SQLException 。看看PreparedStatement,避免转义问题和SQL注入。
  • 是的,这就是问题所在。不包括堆栈跟踪,问题出在未导入的 mysql jdbc 驱动程序上。再次感谢!

标签: java mysql multithreading


【解决方案1】:

客户端断开连接虽然听起来像是系统错误消息,但事实并非如此! 这是你生产的东西。而不是这个:

} catch (Exception e) {
    System.err.println("Exception caught: client disconnected.");
} finally {

} catch (Exception e) {
    e.printStackTrace();
} finally {

这会告诉你真正的错误是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2022-01-23
    • 2012-03-22
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    相关资源
    最近更新 更多