Spring DAO - pierwsze zapytanie z JdbcTemplate zajmuje znacznie więcej czasu

W mojej aplikacji używam Spring MVC ze wzorem DAO, aby uzyskać dostęp do bazy danych MSSql za pomocą JdbcTemplate. Wszystko działa dobrze, ale zauważyłem, że pierwsze zapytanie zajmuje trochę więcej czasu niż kolejne zapytania w każdym pojedynczym żądaniu.

Napisałem prosty test:

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));
}

wynik to:

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

Rozumiem, że są pewne działania, które Spring robi, aby przygotować wszystkie fasole. Ale jeśli istnieje żądanie do serwera, który wykonuje tylko jedno zapytanie, to na każde żądanie trwa 424 milisekundy.

Moje pytanie brzmi: czy to zachowanie jest w porządku? Lub może być jakiś błąd w moim kodzie? Czy działa tak, że na każde żądanie Spring potrzebuje tego czasu na inicjalizację? (a wtedy wszystkie inne zapytania będą działać szybko)? Albo mogę wykonać inicjalizację uruchamiania, a następnie podczas każdego żądania pierwsze zapytanie zajmie również 15 ms?

Moja konfiguracja jest następująca:

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

dao jest wstrzykiwany do klasy testowej z:

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

Używam podejścia opartego na adnotacjach. Klasa testowa i DAO nie korzystają z @Transakcji.

EDIT: Próbowałem również skonfigurować initialSize, ale to nie pomogło (z initialSize = 2 trwa 800ms, z initialSize = 1 trwa 400ms - każde żądanie).

Nie rozumiem, dlaczego na każde żądanie potrzeba 400 ms, gdy jest to możliwe przez 15 ms. Wygląda na to, że wiosną jest trochę nad głową. :(

questionAnswers(3)

yourAnswerToTheQuestion