我在Discord上运行一个bot,它收到了很多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阻止线程?
答案 0 :(得分:1)
我发现您在整个应用程序中只使用一个连接。如果您有大量请求要处理,您应该创建一个连接池,可以使用以下方法完成:
您可以在应用程序端创建连接池。您可以使用apache connection pool.
您可以在服务器端创建连接池。 Read this.
最好,使用hibernate,您有一个名为hibernate.connection.pool_size
的媒体资源。
如果您正在使用JDBC预处理语句,请使用batch processing并避免使用Statement
(我看到您正在这样做),原因是this post中提到的原因。