Java - SQL和线程 - 处理冻结

时间:2014-05-17 20:21:37

标签: java sql multithreading bukkit

我正在为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();

1 个答案:

答案 0 :(得分:1)

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

话虽如此,您应该查看Executor界面,这样您就可以轻松地创建和管理后台任务。 (它仍将由线程支持,但它为您提供了许多开箱即用的常用功能。)