我正在为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();
答案 0 :(得分:1)
我不认为它是管道磁带修复,线程是处理异步任务的正确方法。
话虽如此,您应该查看Executor界面,这样您就可以轻松地创建和管理后台任务。 (它仍将由线程支持,但它为您提供了许多开箱即用的常用功能。)