【问题标题】:Spring NamedParameterJDBCTemplate reuse of Prepared StatementsSpring NamedParameterJDBCTemplate 复用 Prepared Statements
【发布时间】:2012-08-23 05:12:02
【问题描述】:

我正在使用 Spring NamedParameterJdbcTemplate 从表中获取一些值。出于某种原因,查询在我的 Java 应用程序中运行速度非常慢,而不是在 SQL Management Studio 上运行相同的查询。我还在分析器中注意到,准备好的语句不会被重用。如果我在我的 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;

【问题讨论】:

    标签: java spring jdbc jdbctemplate spring-jdbc


    【解决方案1】:

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

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

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

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

    2. 如你所说,同一个PreparedStatement可以用不同的参数调用,数据库引擎可以复用查询执行计划。

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

    【讨论】:

    • 谢谢。我看到的奇怪的事情是即使对于单个查询,运行时间也是 sql server management studio 中运行时间的 50 倍左右。我将尝试摆脱命名参数,看看是否直接 sql 解决了这个问题。再次感谢。
    • 我认为这是一个不同的问题,请检查您的 jdbc 驱动程序的配置。使用驱动程序和只执行查询的 Main 方法创建一个新项目,纯 sql。慢 50 倍太多了。
    • 很多数据库缓存了给定SQL语句的执行计划,所以当你有独立的PreparedStatement实例发出相同的SQL查询时,即使提供的参数也不会再次创建执行计划沿途不同
    猜你喜欢
    • 2014-03-29
    • 1970-01-01
    • 2015-07-14
    • 2013-08-25
    • 1970-01-01
    • 2016-10-25
    • 2013-05-05
    • 2015-09-03
    • 2014-04-14
    相关资源
    最近更新 更多