- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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/
我正在编写一个小型 spring 应用程序,它在以下代码的上下文中具有 jdbc 功能... 我有以下 java 来设置 SQL 查询字符串: String sql =
这个问题已经在标题中得到了很好的概括。当查询没有返回结果时,JdbcTemplate.queryForList() 将返回什么。它会返回一个空 List 还是 null 值?我无法从文档中找到明确的答
我无法将从 MySQL 数据库检索的数据放入对象列表中。我想返回数据并将其存储到列表中。一旦我这样做了,我希望数据可用于前端框架的检索。 但是我收到了不兼容的类型错误,我无法将数据返回到列表中。 注意
我正在使用 Spring jdbcTemplate 在我的 Java 应用程序中运行 MySQL 查询。这是我的功能: public static ArrayList> query(String q)
我正在以下列方式使用 jdbcTemplate.queryForList 执行命名查询: List conversations = jdbcTemplate.queryForList(
我想知道如何使用 Mockito 模拟特定代码: List> list = jdbcTemplate.queryForList( sqlQuery, new Object[] { in
这是我经历过的一个非常奇怪的场景,但我无法找出原因。 这是我的代码。 public CreditCard getCardByNumber(String creditCardNumber) {
我正在学习 Spring Core 认证,我对 JdbcTemplate use 的使用有一些疑问。 我知道 JdbcTemplate 为我提供了不同的方法来执行查询(用 SQL 编写)。 所以我有以
我正在尝试同时了解 Spring 4 和 Java 8。我有课 EmployeeDTO |-id |-Emp_Name |-Address 当我尝试使用以下代码来获取 1 名员工时,它工作正常: pu
我的 Java (JDK6) 项目使用 Spring和 JDBCTemplate对其所有数据库访问。我们最近从 Spring 2.5 升级到 Spring 3 (RC1)。该项目不使用像 Hibern
我正在尝试将方法 viewEmployees 中的 jdbcTemplate.queryForList 语句从我的类 EmployeeDAO 发送到另一个名为 EmployeeServiceImpl
我是一名优秀的程序员,十分优秀!