java - 我想我用错了 JDBC

标签 java mysql jdbc

好的,这是我的情况 我有一个议程/日历应用程序(用 JavaFX 制作)。 它的工作原理是我的网站上有 2 个 MySQL 数据库。 数据库是账户和议程 在帐户数据库中,每个帐户都有一个用户名、密码和代码字段列表。 我的议程的工作方式是您使用 UUID 代码识别每个议程。 议程的字段是代码、名称、创建者、版主和数据。 现在一切正常,但它非常慢,因为我刚刚进入数据库和服务器编程,我可能做错了什么,因为我知道 MySQL 非常快。

登录功能大约需要 10 秒(用户每有一个议程就增加 1 秒)。那么有人可以帮我解决这个问题吗?

帐户.java http://pastebin.com/kh0i7Cp4

Agenda.java http://pastebin.com/5RxxV8S2

登录.java

package application;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
import javafx.stage.Stage;

public class Login extends Stage {
    TextField userTextField;
    PasswordField pwBox;
    public Button acc;

    public Login() {
        GridPane grid = new GridPane();
        grid.setAlignment(Pos.CENTER);
        grid.setHgap(10);
        grid.setVgap(10);
        grid.setPadding(new Insets(25, 25, 25, 25));

        Scene scene = new Scene(grid, 300, 275);
        setScene(scene);
        this.setTitle("Appgenda");
        Text scenetitle = new Text("Welcome");
        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
        grid.add(scenetitle, 0, 0, 2, 1);

        Label userName = new Label("User Name:");
        grid.add(userName, 0, 1);

        userTextField = new TextField();
        grid.add(userTextField, 1, 1);

        Label pw = new Label("Password:");
        grid.add(pw, 0, 2);

        pwBox = new PasswordField();
        grid.add(pwBox, 1, 2);
        Button btn = new Button("Sign in");
        acc = new Button("Create Account");
        HBox hbBtn = new HBox(10);
        hbBtn.setAlignment(Pos.BOTTOM_RIGHT);
        hbBtn.getChildren().add(btn);
        hbBtn.getChildren().add(acc);
        acc.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                new CreateAccount().show();
                close();

            }

        });
        grid.add(hbBtn, 1, 4);
        btn.setOnAction(new EventHandler<ActionEvent>() {

            @Override
            public void handle(ActionEvent arg0) {
                handleIt();

            }

        });
        show();
        setResizable(false);
    }

    private void handleIt() {
        int login = login(userTextField.getText(), pwBox.getText());
        if (login == 1) {
            // notpass
        } else if (login == 2) {
            // notuser
        } else if (login == 3) {
            // exception or server has no accounts
        } else if (login == 0) {
            // login
            dispose();
        } else {

        }
    }

    private void dispose() {
        close();
    }

    public static int login(String u, String p) {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection conn = DriverManager.getConnection(Global.URL
                    + Global.DATABASE, Global.USERNAME, Global.PASSWORD);
            PreparedStatement ps = conn
                    .prepareStatement("select * from Accounts where Username = '"
                            + u + "'");
            ResultSet x = ps.executeQuery();
            if (x.next()) {
                if (x.getString(2).equals(p)) {
                    // login
                    new JFXPanel();
                    Platform.runLater(new Runnable() {

                        @Override
                        public void run() {
                            try {
                                newWindow(x.getString(1));
                            } catch (SQLException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }

                        }

                    });
                    System.out.println("Succesful login");

                    return 0;
                } else {

                    return 1;
                }
            } else {

                return 2;
            }
        } catch (Exception e) {
            return 3;
        }
    }

    private static void newWindow(String s) {
        new UserWindow(Account.getAccount(s)).show();
    }
}

最佳答案

对于每个数据库交互(选择、插入、更新和删除),您都会打开一个新连接并且不要关闭它。如果您可以使用数据库连接池来重用连接,那就更好了。

您可以在应用程序启动时初始化连接池,并在应用程序关闭时将其关闭。

Apache Commons DBCP是完成这项工作的好组件。

有很多关于 jdbc 连接池的主题,您可以阅读这些主题并获得一些不错的选择和技巧来提高应用程序的性能。

问候。

关于java - 我想我用错了 JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29152935/

相关文章:

java - Sonar "duplicated code"在哪里?

MySQL 查询在日期范围内返回错误的结果计数

java - 关于结果集类型 JDBC

java - Spek 测试未在 Maven Java 项目中运行

带有复选框的 Java 嵌套 JPanel

mysql - 无法深入访问字段多个子查询

Java JTable 不显示 MySQL 中的所有行

java - 使用 JButtons 通过 JDBC 执行 SQL 查询

java - .classpath 中排除了 Spring Boot + Eclipse : why application. 属性?

mysql - Visual Studio 2013 MySQL 模块安装失败