4

Oracle データベースへの JDBC 呼び出しを必要とするプロジェクトに取り組んでいます。SpringJDBC で動作するように UCP プーリングをセットアップしました。次のように実行しているかなり単純なクエリがあります...

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 が 1 つしかない限り、これはすべて正常に実行されます。2 番目の 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 に答える