2012-08-08 1213 views
3

我正在处理一个需要JDBC调用Oracle数据库的项目。我已经建立了UCP池与SpringJDBC合作。我有我执行类似下面的相当简单的查询...Spring NamedParameterJdbcTemplate查询的性能很慢

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()); 

这一切都进行罚款只要在阵列中只有一个id。当我添加第二个ID时,查询需要将近5分钟才能运行。如果我采用确切的查询并在SQLDeveloper中执行它,则需要0.093秒。

一些东西一定会严重地错误与我的代码或配置......有没有人有任何想法?

编辑:

我剥出春天是NamedParameterJdbcTemplate的使用,并只用简单的JDBC去,一切似乎进行巨大。 NamedParameterJdbcTemplate在做什么不同?

回答

0

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

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

下面的链接解释了区别。

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

+1

它不是Spring-jdbc vs jdbc,它的任何绑定变量问题。无论是spring-jdbc还是纯jdbc,如果在使用jdbc的java程序中都存在绑定变量,那么文章中关于基于成本的优化程序所说的内容是否属实。我会更多地考虑你的代码如何与spring-jdbc一起工作。为什么不尝试使用'template.queryForList()'而不是'template.query()'来查看结果。 – Annjawn 2012-08-08 21:14:15

+0

@Annjawn好点,会更新答案 – theMothaShip 2012-08-08 21:17:23