gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:16:07 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

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

关于java - 如何提高 JDBC 查询执行的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50089761/

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