【问题标题】:How to improve performance of JDBC query execution?如何提高 JDBC 查询执行的性能?
【发布时间】: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 建立大量连接。
  • 连接在启动时启动,然后在整个程序中引用。
  • 所以只有一个连接?我建议有一个连接池。使用连接池。

标签: java mysql


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    相关资源
    最近更新 更多