【问题标题】:Performance of Spring NamedParameterJdbcTemplate Query is very slowSpring NamedParameterJdbcTemplate Query 的性能很慢
【发布时间】:2012-08-05 21:08:13
【问题描述】:

我正在处理一个需要对 Oracle 数据库进行 JDBC 调用的项目。我已经设置了 UCP 池以使用 SpringJDBC。我有一个相当简单的查询,我正在执行如下...

SELECT * FROM TABLE WHERE ID IN (:ids)

我设置此查询的 java 代码如下所示...

NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(datasource);
Map<String,Object> paramMap = new HashMap<String,Object>();
paramMap.put("ids", Arrays.asList(idArray));

List<Result> results = template.query("SELECT * FROM TABLE WHERE ID IN (:ids)",
    paramMap, new ResultRowMapper());

只要数组中只有 1 个 id,这一切都可以正常运行。当我添加第二个 ID 时,查询需要将近 5 分钟才能运行。如果我采用确切的查询并在 SQLDeveloper 中执行它,则需要 0.093 秒。

我的代码或配置一定有什么问题……有人有什么想法吗?

编辑:

我去掉了 Spring NamedParameterJdbcTemplate 的使用,直接使用了 Jdbc,一切似乎都表现得很好。 NamedParameterJdbcTemplate 有什么不同?

【问题讨论】:

    标签: java oracle spring jdbc spring-jdbc


    【解决方案1】:

    好吧,在这种情况下,我发现了我的直接 jdbc 解决方案和我的 spring-jdbc 解决方案之间的区别......看起来正如@Annjawn 下面解释的那样,这是一个绑定变量问题而不是 spring-jdbc 问题。我的 spring-jdbc 问题试图将变量绑定到索引(不存在),从而进行表扫描......

    我的直接 JDBC 解决方案最终只是进行字符串替换并按原样执行,因此没有表扫描...

    下面的链接解释了不同之处。

    http://bytes.com/topic/oracle/answers/65559-jdbc-oracle-beware-bind-variables

    【讨论】:

    • 不是 Spring-jdbc vs jdbc,而是任何绑定变量问题。无论是 spring-jdbc 还是普通 jdbc,如果在使用 jdbc 的 java 程序中有绑定变量,文章中关于基于成本的优化器的说法都是正确的。我认为这更多的是您的代码如何与 spring-jdbc 一起使用。为什么不尝试使用template.queryForList() 而不是template.query() 查看结果。
    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-16
    • 2019-03-22
    • 2022-01-09
    • 2015-08-26
    相关资源
    最近更新 更多