我认为我错误地使用了JDBC

时间:2015-03-19 19:03:36

标签: java mysql jdbc

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

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

Account.java http://pastebin.com/kh0i7Cp4

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

Login.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();
    }
}

1 个答案:

答案 0 :(得分:2)

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

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

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

有很多关于jdbc连接池的主题,您可以阅读并获得一些好的选项和提示,以提高应用程序的性能。

问候。