好的,这就是我的情况 我有一个议程/日历应用程序(用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();
}
}
答案 0 :(得分:2)
对于每个数据库交互(选择,插入,更新和删除),您打开一个新连接,不要关闭它。如果您可以使用数据库连接池以重用连接,那会更好。
您可以在应用程序启动时初始化连接池,并在应用程序关闭时关闭它。
Apache Commons DBCP是完成这项工作的好组成部分。
有很多关于jdbc连接池的主题,您可以阅读并获得一些好的选项和提示,以提高应用程序的性能。
问候。