2012-08-28 77 views
3

在我的應用程序中,我使用帶有DAO模式的Spring MVC使用JdbcTemplate訪問MSSql數據庫。一切工作正常,但我已經注意到,第一個查詢需要更長的時間,然後在每個請求中的下一個查詢。Spring DAO - 使用JdbcTemplate進行第一次查詢需要更長的時間

我寫了一個簡單的測試:

String sql = "SELECT 1"; 
for (int i = 0; i < 5; i++) { 
    long startTime = System.currentTimeMillis(); 
    jdbcTemplate.queryForList(sql); 
    logger.debug("query took: " + TimeHelper.showDuration(startTime)); 
} 

結果是:

2012-08-28 12:55:07,665 | Start 
2012-08-28 12:55:08,878 | query took: 424 milliseconds 
2012-08-28 12:55:08,893 | query took: 15 milliseconds 
2012-08-28 12:55:08,908 | query took: 14 milliseconds 
2012-08-28 12:55:08,922 | query took: 14 milliseconds 
2012-08-28 12:55:08,937 | query took: 14 milliseconds 

據我所知,有一些活動春季是做讓所有豆類準備。但是如果有請求只執行一個查詢的服務器,則每個請求需要424毫秒。

我的問題是:這種行爲好嗎?或者我的代碼中可能存在一些錯誤?它是否工作,以便每次請求Spring需要這個時間進行初始化? (並且請求中的所有其他查詢都會很快運行)?或者我可以做一些啓動初始化,然後在每次請求期間,第一個查詢也將花費15毫秒?

我的配置是如下因素:

datasource: class="org.apache.commons.dbcp.BasicDataSource" 

道被注入到測試類:

@Resource(name="testDao") 
private TestDao testDao; 

我用註釋爲基礎的方法。測試類和DAO不使用@Transaction。我也嘗試配置initialSize,但這並沒有幫助,(initialSize = 2需要800ms,初始大小= 1需要400ms - 每個請求)。

我不明白爲什麼每次請求需要400毫秒時纔有可能持續15毫秒。這看起來像是Spring的一些開銷。 :(

回答

1

你的DataSource是一個連接池,第一個查詢需要連接,隨後的查詢重新使用連接,你可以配置dbcp預先創建一些連接,或者在應用程序啓動後手動連接和釋放

+0

我試圖配置DBCP初始大小= 2(這個數字越高,它需要的時間越長),但是這種行爲在每個reguest上重複,所以如果我在啓動時連接它不會有幫助,好像所有連接都是請求完成時關閉,或者AOP出現問題(調用jdbcTemplate.queryForList時會彈出一些bean的搜索結果)? – user1335851

+0

JDBC時間我測量了幾年前:建立tcp連接〜700ms;準備聲明〜70ms;執行語句〜10ms。所以這聽起來像是建立連接的時機。我會看看連接池配置。查看v $ session來查看jdbc連接的建立時間和時間。如果從1連接變爲2連接將時間從400ms改變爲800ms,那麼這是另一個強指針。 – Glenn

0

看一看在javadocsourcegetExceptionTranslator()可能涉及一些設置工作。也許你可以當工作與lazy-init參數發生控制。

0

我檢查了連接池及其連接(INITIALSIZE)是在第一次調用時需要連接時創建,然後在所有請求中重用這是它應該如何工作:),我也注意到,當同時有多個請求時,400ms時間更低(大約100ms)。我認爲初始時間較長的原因是因爲John Watts提到的建立TCP連接或者由於一些Spring後臺管理。

相關問題