有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何提高JDBC查询执行的性能?

我在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阻塞线程


共 (1) 个答案

  1. # 1 楼答案

    我发现在整个应用程序中,您只使用了一个连接。如果需要处理大量请求,则应该创建一个连接池,可以使用以下方法来完成:

    1. 您可以在应用程序端创建连接池。你可以使用apache connection pool.

    2. 您可以在服务器端创建连接池Read this.

    3. 最好使用hibernate,这里有一个名为hibernate.connection.pool_size的属性

    如果您使用的是JDBC prepared语句,那么请使用batch processing,并避免使用Statement(我看到您正在这样做),因为this post中提到的原因