Java-SQL和线程-处理冻结

Java-SQL和线程-处理冻结,java,sql,multithreading,bukkit,Java,Sql,Multithreading,Bukkit,我正在为Bukkit开发一个插件,并开始试验SQL。我有一切工作,并有减少代码膨胀等功能 我的问题是,我注意到当我执行SQL更新时,服务器将冻结所有操作大约5秒钟。通过进一步研究,我刚刚将所有SQL语句封装到线程中,这个问题已经解决了。根据我个人的猜测,我认为冻结是由服务器线程内部执行的SQL造成的,当执行这些语句时,因为我正在等待来自数据库的结果,它将导致主服务器线程冻结,直到它检索到这些结果,因此,通过将这些语句放在一个单独的线程中,可以解决这个问题 我的问题是,我可以把所有SQL语句放在线

我正在为Bukkit开发一个插件,并开始试验SQL。我有一切工作,并有减少代码膨胀等功能

我的问题是,我注意到当我执行SQL更新时,服务器将冻结所有操作大约5秒钟。通过进一步研究,我刚刚将所有SQL语句封装到线程中,这个问题已经解决了。根据我个人的猜测,我认为冻结是由服务器线程内部执行的SQL造成的,当执行这些语句时,因为我正在等待来自数据库的结果,它将导致主服务器线程冻结,直到它检索到这些结果,因此,通过将这些语句放在一个单独的线程中,可以解决这个问题

我的问题是,我可以把所有SQL语句放在线程中吗?这是管道胶带修复吗?我能更好地解决这个问题吗

示例函数

public void makeUpdate(String statement){

    // TO BE USED WITH - INSERT, UPDATE, or DELETE
    Connection con = null;
    Statement st = null;

    String url = "jdbc:mysql://127.0.0.1/mydata_base";
    String user = "myuser";
    String password = "mypassword";

    try {
        con = (Connection) DriverManager.getConnection(url, user, password);
        st = (Statement) con.createStatement();

        int rs = st.executeUpdate(statement);

    } catch (SQLException ex) {
        Logger lgr = Logger.getLogger(Version.class.getName());
        lgr.log(Level.SEVERE, ex.getMessage(), ex);

    } finally {
        try {
            if (st != null) {
                st.close();
            }
            if (con != null) {
                con.close();
            }

        } catch (SQLException ex) {
            Logger lgr = Logger.getLogger(Version.class.getName());
            lgr.log(Level.WARNING, ex.getMessage(), ex);
        }
    }
}
导致服务器冻结的代码示例

// Here would be 3 statements updating user info.
// This would cause the server to freeze for about 5 seconds until these completed.
makeUpdate("UPDATE blah SET blah = blah WHERE blah = blah");
makeUpdate("UPDATE blah SET blah = blah WHERE blah = blah");
makeUpdate("UPDATE blah SET blah = blah WHERE blah = blah");
修复冻结的代码示例。

new Thread(new Runnable(){
public void run(){
    makeUpdate("UPDATE blah SET blah = blah WHERE blah = blah");
    makeUpdate("UPDATE blah SET blah = blah WHERE blah = blah");
    makeUpdate("UPDATE blah SET blah = blah WHERE blah = blah");
    }
}).start();

我不认为这是管道胶带修复,线程是处理异步任务的正确方法


话虽如此,您应该看看界面,它为您提供了一种创建和管理后台任务的较少动手的方法。(它仍然有线程支持,但它提供了许多现成的常用功能。)

太棒了,谢谢。至于我关于为什么会发生冰冻的理论,你认为我有什么地方是正确的吗?我不熟悉bukkit,所以我不能给你一个100%的答案,但是的,你的理论是合理的,可能是正确的。