Spring NamedParameterJdbcTemplate查询的性能非常慢

时间:2012-08-08 17:25:01

标签: java oracle spring jdbc spring-jdbc

我正在开发一个需要对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.93秒。

我的代码或配置必定会出现严重问题......有没有人有任何想法?

编辑:

我删除了Spring NamedParameterJdbcTemplate的使用,并且只使用了直接的Jdbc,一切看起来都很棒。 NamedParameterJdbcTemplate的做法有何不同?

1 个答案:

答案 0 :(得分:0)

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

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

以下链接解释了差异。

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