gpt4 book ai didi

Java - SQL 和线程 - 处理卡住

转载 作者:行者123 更新时间:2023-12-01 12:58:20 24 4
gpt4 key购买 nike

我正在为 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界面,为您提供了一种较少动手的方式来创建和管理后台任务。 (它仍然由线程支持,但它为您提供了许多开箱即用的常用功能。)

关于Java - SQL 和线程 - 处理卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23715723/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com