2012-08-08 116 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