簡體   English   中英

Java-SQL和線程-處理凍結

[英]Java - SQL And Threads - Dealing With Freezing

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

我不認為這是解決問題的方法,線程是處理異步任務的正確方法。

話雖如此,您應該看一下Executor界面,它為您創建和管理后台任務提供了一種不太實際的方法。 (它仍將由線程支持,但它為您提供了許多常用功能。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM