gpt4 book ai didi

Java Spring jdbcTemplate queryForList 慢

转载 作者:行者123 更新时间:2023-11-29 04:23:05 31 4
gpt4 key购买 nike

我正在使用 Spring jdbcTemplate 在我的 Java 应用程序中运行 MySQL 查询。这是我的功能:

public static ArrayList<Map<String, Object>> query(String q) throws Exception {

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

@SuppressWarnings("unchecked")
List<Map<String, Object>> result = jdbcTemplate.queryForList(q);

return (ArrayList<Map<String, Object>>) result;

}

在这种特殊情况下,我将此查询传递给函数:

"SELECT * FROM test WHERE name IN('string1', 'string2', 'string3', ...)";

表格test只有 6 列,IN 中的字符串从几个到 100 个符号不等。 jdbcTemplate.queryForList()需要 280 毫秒 来运行查询。注意:jdbcTemplate.queryForList() 需要 280 毫秒运行,不是整个功能query .当我在 MySQL 客户端 (HeidiSQL) 上运行完全相同的查询时,它只需要 16 毫秒更新:Heidi 保持开放连接,因此这不是一个公平的比较。

问题:为什么是jdbcTemplate.queryForList()与在 MySQL 客户端上运行的相同查询相比,速度慢得可怜吗?我使用它纯粹是为了方便,它可以在 ArrayList<Map<String, Object>> 中检索结果这就是我需要的。有什么我可以做的来加快速度还是我应该放弃 jdbcTemplate一起使用其他东西?

更新: 好的,所以我将我的函数从 jdbcTemplate 更改为使用普通 jdbc。这就是那个可憎之物的样子。这就是我首先使用 jdbcTemplate 的原因。现在运行相同的查询需要 200 毫秒 - 略有改进,但仍然太慢...

public static ArrayList<Map<String,Object>> query(String Full_Command) {

try {

String URL = "jdbc:mysql://localhost/dbname";
String USER = "root";
String PASS = "";
java.sql.Connection Con = DriverManager.getConnection(URL, USER, PASS);

//create statement
Statement Stm = null;
//Stm = Con.createStatement();
Stm = (Statement) Con.createStatement();

//query
ResultSet Result = null;
boolean Returning_Rows = Stm.execute(Full_Command);
if (Returning_Rows) {
Result = Stm.getResultSet();
} else {
return new ArrayList<Map<String,Object>>();
}

//get metadata
ResultSetMetaData Meta = null;
Meta = Result.getMetaData();

//get column names
int Col_Count = Meta.getColumnCount();
ArrayList<String> Cols = new ArrayList<String>();
for (int Index=1; Index<=Col_Count; Index++) {
Cols.add(Meta.getColumnName(Index));
}

//fetch out rows
ArrayList<Map<String, Object>> Rows = new ArrayList<Map<String,Object>>();

while (Result.next()) {
HashMap<String,Object> Row = new HashMap<String,Object>();
for (String Col_Name:Cols) {
Object Val = Result.getObject(Col_Name);
Row.put(Col_Name,Val);
}
Rows.add(Row);
}

//close statement
Stm.close();

//pass back rows
return Rows;

} catch (Exception Ex) {

System.out.print(Ex.getMessage());
return new ArrayList<Map<String,Object>>();

}

}

UPDATE2:我没有将 JDBC 函数分解为执行时间,这一行是瓶颈,每次大约需要 190 毫秒:

java.sql.Connection Con = DriverManager.getConnection(URL, USER, PASS);

有什么意见吗?

最佳答案

这不是 JdbcTemplate 的错。原因如下:

首先,您必须降低建立连接的开销。此开销可能高达 500 毫秒。这是正常

其次,当您在 MySQL 客户端上运行查询时,您是否在运行程序后立即运行它?因为查询会被缓存……即使是在磁盘 I/O 级别。因此,如果您两次运行相同的查询,由于缓存,第二次运行速度会更快。

第三,您是否正在为 name 列编制索引?

第四,如果连接开销对您来说真的很重要,您可以考虑保留连接甚至连接池。

关于Java Spring jdbcTemplate queryForList 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18078781/

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