gpt4 book ai didi

java - Spring NamedParameterJDBCTemplate 重用Prepared Statements

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:16 25 4
gpt4 key购买 nike

我正在使用 Spring NamedParameterJdbcTemplate 从表中获取一些值。出于某种原因,与在 SQL Management Studio 上运行相同的查询相比,查询在我的 Java 应用程序中运行得非常慢。我还在探查器中注意到,准备好的语句不会被重用。如果我在我的 JAVA 应用程序中多次运行相同的查询,我会看到正在执行不同的准备好的语句。所以,不确定为什么这些语句没有被重用。性能变慢是因为我在查询中使用了 IN 子句吗?

这是我的示例 java 代码

StringBuilder vQuery = new StringBuilder();
vQuery.append(" SELECT SUM(Qty) FROM vDemand");
vQuery.append(" WHERE ProductID = :ProductID");
vQuery.append(" AND [Date] >= :StartDate AND [Date] <= :EndDate");
vQuery.append(" AND CustomerID IN ( :CustomerID )");

MapSqlParameterSource vNamedParameters = new MapSqlParameterSource();
vNamedParameters.addValue("ProductID", aProductID);
vNamedParameters.addValue("CustomerID", aCustomerlIDs);
vNamedParameters.addValue("StartDate", aDate, Types.TIMESTAMP);
vNamedParameters.addValue("EndDate", aDate, Types.TIMESTAMP);

int vTotalQuantity = this.getNamedParameterJdbcTemplate().queryForInt(vQuery.toString(), vNamedParameters);
return vTotalQuantity;

最佳答案

查看Spring的NamedParameterJdbcTemplate源码,它把你的SQL解析成一个结构体ParsedSql,然后用问号替换你的命名参数,然后构建PreparedStatement 并用您的参数填充它。

它缓存 ParsedSql 条目,但始终构建新的 PreparedStatements,因此最终这些不会在 JDBC 驱动程序级别重用。

PreparedStatement 与常规 Statement 相比有两个优点:

  1. 您可以使用方法将参数添加到 SQL,而不是在 SQL 查询本身中执行。这样您就可以避免 SQL 注入(inject)攻击,还可以让驱动程序为您进行类型转换。

  2. 正如您所说,可以使用不同的参数调用相同的PreparedStatement,数据库引擎可以重用查询执行计划。

NamedParameterJdbcTemplate 似乎可以帮助您获得第一个优势,但对后者没有任何帮助。

关于java - Spring NamedParameterJDBCTemplate 重用Prepared Statements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12163591/

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