Java-SQL和线程-处理冻结
我正在为Bukkit开发一个插件,并开始试验SQL。我有一切工作,并有减少代码膨胀等功能 我的问题是,我注意到当我执行SQL更新时,服务器将冻结所有操作大约5秒钟。通过进一步研究,我刚刚将所有SQL语句封装到线程中,这个问题已经解决了。根据我个人的猜测,我认为冻结是由服务器线程内部执行的SQL造成的,当执行这些语句时,因为我正在等待来自数据库的结果,它将导致主服务器线程冻结,直到它检索到这些结果,因此,通过将这些语句放在一个单独的线程中,可以解决这个问题 我的问题是,我可以把所有SQL语句放在线程中吗?这是管道胶带修复吗?我能更好地解决这个问题吗 示例函数Java-SQL和线程-处理冻结,java,sql,multithreading,bukkit,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();
我不认为这是管道胶带修复,线程是处理异步任务的正确方法
话虽如此,您应该看看界面,它为您提供了一种创建和管理后台任务的较少动手的方法。(它仍然有线程支持,但它提供了许多现成的常用功能。)太棒了,谢谢。至于我关于为什么会发生冰冻的理论,你认为我有什么地方是正确的吗?我不熟悉bukkit,所以我不能给你一个100%的答案,但是的,你的理论是合理的,可能是正确的。