【发布时间】:2018-04-29 18:09:56
【问题描述】:
我在 Discord 上运行一个机器人,它接收到 MySQL 数据库的大量请求,最近 MySQL 开始阻塞线程,导致程序出现严重延迟。
转储线程后,我发现有问题的行位于 JDBC 的 PreparedStatement 代码中,但我真的不确定是什么导致了这个问题。
下面的代码块是发生错误的地方:
public List<HashMap<String, Object>> find(String haystack, Object... needles){
PreparedStatement prep = null;
List<HashMap<String, Object>> results = new ArrayList<>();
ResultSet rs = null;
try{
prep = connection.prepareStatement(haystack);
for(int i = 0; i < needles.length; i++){
prep.setObject(i+1, needles[i]);
}
rs = prep.executeQuery();
while(rs.next()){
HashMap<String, Object> result = new HashMap<>();
for(int i = 1; i < rs.getMetaData().getColumnCount() + 1; i++){
result.put(rs.getMetaData().getColumnName(i), rs.getObject(i));
}
results.add(result);
}
}catch(SQLException e){
System.out.println("MySQL > Unable to execute query: " + e.getMessage());
}finally{
try{
if(rs!=null)rs.close();
if(prep!=null)prep.close();
}catch(SQLException e){
System.out.println("(find) Error closing: " + e.getMessage());
}
}
return results;
}
rs = prep.executeQuery(); 是有问题的代码行。
有什么方法可以阻止 MySQL 阻塞线程?
【问题讨论】:
-
为什么不在
PreparedStatement中创建一个批处理,然后一次执行所有操作? -
我真的不确定如何去做。
-
我看到你提到你收到很多请求,你是如何创建连接对象的?也许问题就在那里。它可能正在与 MySQL 建立大量连接。
-
连接在启动时启动,然后在整个程序中引用。
-
所以只有一个连接?我建议有一个连接池。使用连接池。