[英]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.