Java 当我第一次按下连接到SQL Server 2012数据库并执行特定查询的JFX按钮时,为什么会出现延迟?
这是我做的一个小java程序登录示例,当我运行它并按下JFXButton登录时,会发生大约1秒的延迟,如图所示,知道程序在延迟后成功连接和查询 之后,当我再次按下那个按钮时,它会快速平稳地运行,直到我停下来再次运行 请注意,将我带到另一个场景的“注册JFXButton”工作正常,并且我对该字段是新手。谢谢:) 这是DBHanler类(用于连接)Java 当我第一次按下连接到SQL Server 2012数据库并执行特定查询的JFX按钮时,为什么会出现延迟?,java,javafx,jdbc,prepared-statement,Java,Javafx,Jdbc,Prepared Statement,这是我做的一个小java程序登录示例,当我运行它并按下JFXButton登录时,会发生大约1秒的延迟,如图所示,知道程序在延迟后成功连接和查询 之后,当我再次按下那个按钮时,它会快速平稳地运行,直到我停下来再次运行 请注意,将我带到另一个场景的“注册JFXButton”工作正常,并且我对该字段是新手。谢谢:) 这是DBHanler类(用于连接) 我的问题已通过使用与问题本身无关的@Slaw建议解决,但SQL语句“select*from[User]where userName=?and user
我的问题已通过使用与问题本身无关的@Slaw建议解决,但SQL语句
“select*from[User]where userName=?and userPass=?”
strong表示您正在数据库中存储纯文本密码。我希望不是这样,而且userPass
实际上是一个使用Salt的哈希密码版本。我猜SQL引擎第一次运行时需要填充缓冲区缓存,这需要一秒钟的时间。对于后续的每次运行,缓存都已被填满,因此查询的运行速度要快得多。根据您创建的连接字符串,我猜您使用的是MySQL——您可以在这里阅读有关缓冲池的更多信息:您正在JavaFX应用程序线程上执行此JDBC代码。FX线程负责更新UI状态和调度渲染“脉冲”,这意味着它不能在忙于做其他事情时执行任何操作,因此UI冻结。在后台线程上执行此操作,并将结果(如果有)发布回FX线程。请参见。@Larnu此程序是用于个人教育的,我还处于开始阶段,因此userPass还不是密码的哈希版本。但我一定会做的。另外,谢谢你,正如你提到的,你正在学习,请查看。
public void initialize(URL location, ResourceBundle resources) {
progressBar.setStyle("-fx-background-color: green");
progressBar.setVisible(false);
wrngPassLbl.setVisible(false);
handler = new DBHandler();
}
@FXML
public void loginAction(ActionEvent e) {
progressBar.setVisible(true);
PauseTransition pt = new PauseTransition();
pt.setDuration(Duration.seconds(3));
pt.setOnFinished(ex -> {
System.out.println("Login successful.");
});
pt.play();
String q1 = "select * from [User] where userName=? and userPass=?";
dbConnection = handler.getConnection();
try {
pst = dbConnection.prepareStatement(q1);
pst.setString(1, usrTxt.getText());
pst.setString(2, passTxt.getText());
ResultSet result = pst.executeQuery();
int count = 0;
while (result.next()) {
count++;
}
if (count == 1) {
System.out.print("Connection is successfully established");
} else if (count == 0) {
System.out.print("wrong username or password");
}
pst.close();
dbConnection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
public class DBHandler extends Configs {
Connection dbConnection;
public Connection getConnection() {
Properties prop = new Properties();
prop.setProperty("user", dbUser);
prop.setProperty("password", dbPass);
prop.setProperty("useSSL", "false");
prop.setProperty("autoReconnect", "true");
String connectionString = "jdbc:mysql://" + dbHost + ":" + dbPort + "/" + dbName;
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
try {
dbConnection = DriverManager.getConnection(connectionString,prop);
} catch (SQLException ex) {
ex.printStackTrace();
}
return dbConnection;
}
}