我想我用错了 JDBC
I think i am using JDBC wrong
好的,这是我的情况
我有一个 agenda/calendar 应用程序(使用 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();
}
}
对于每个数据库交互(select、插入、更新和删除),您都会打开一个新连接并且不要关闭它。如果您可以使用数据库连接池以重用连接会更好。
您可以在应用程序启动时初始化连接池,并在应用程序关闭时关闭它。
Apache Commons DBCP 是完成这项工作的好组件。
有很多关于 jdbc 连接池的主题,您可以阅读这些主题并获得一些不错的选项和提示,以提高应用程序的性能。
此致。
好的,这是我的情况 我有一个 agenda/calendar 应用程序(使用 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();
}
}
对于每个数据库交互(select、插入、更新和删除),您都会打开一个新连接并且不要关闭它。如果您可以使用数据库连接池以重用连接会更好。
您可以在应用程序启动时初始化连接池,并在应用程序关闭时关闭它。
Apache Commons DBCP 是完成这项工作的好组件。
有很多关于 jdbc 连接池的主题,您可以阅读这些主题并获得一些不错的选项和提示,以提高应用程序的性能。
此致。