我正在开发一个需要对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的做法有何不同?
答案 0 :(得分:0)
好吧,在这种情况下,我发现我的直接jdbc解决方案和我的spring-jdbc解决方案之间存在差异......看来,正如@Annjawn在下面解释的那样,它是一个绑定变量问题而不是spring-jdbc问题。我的spring-jdbc问题试图将变量绑定到索引(不存在),从而进行表扫描......
我的直接JDBC解决方案最终只是执行字符串替换并执行,因此没有表扫描...
以下链接解释了差异。
http://bytes.com/topic/oracle/answers/65559-jdbc-oracle-beware-bind-variables