4

我正在开发一个需要对 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 有什么不同?

4

1 回答 1

1

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

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

下面的链接解释了差异。

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

于 2012-08-08T21:06:47.907 回答