Java 当我第一次按下连接到SQL Server 2012数据库并执行特定查询的JFX按钮时,为什么会出现延迟?

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

这是我做的一个小java程序登录示例,当我运行它并按下JFXButton登录时,会发生大约1秒的延迟,如图所示,知道程序在延迟后成功连接和查询

之后,当我再次按下那个按钮时,它会快速平稳地运行,直到我停下来再次运行

请注意,将我带到另一个场景的“注册JFXButton”工作正常,并且我对该字段是新手。谢谢:)

这是DBHanler类(用于连接)


我的问题已通过使用与问题本身无关的@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;
    }
}