私のアプリケーションでは、DAOパターンでSpring MVCを使用して、JdbcTemplateでMSSqlデータベースにアクセスします。すべてが正常に機能していますが、最初のクエリは、各単一のリクエストで次のクエリよりも少し時間がかかることに気付きました。
私は簡単なテストを書きました:
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
SpringがすべてのBeanを準備するために行っているいくつかのアクティビティがあることを理解しています。ただし、1つのクエリのみを実行するサーバーへの要求がある場合、各要求で424ミリ秒かかります。
私の質問は:この振る舞いは大丈夫ですか?または、コードにバグがある可能性がありますか?各リクエストでSpringがこの時間を初期化に必要とするように機能しますか?(そして、リクエスト内の他のすべてのクエリは高速で実行されます)?または、スタートアップの初期化を行うことができます。その後、各リクエスト中に最初のクエリにも15ミリ秒かかりますか?
私の構成は次のとおりです。
datasource: class="org.apache.commons.dbcp.BasicDataSource"
daoは、次のテストクラスに注入されます。
@Resource(name="testDao")
private TestDao testDao;
私は注釈ベースのアプローチを使用しています。テストクラスとDAOは@Transactionを使用しません。
編集:私もinitialSizeを構成しようとしましたが、これは役に立ちませんでした(initialSize = 2の場合は800ミリ秒かかり、initialSize = 1の場合は400ミリ秒かかります-各リクエスト)。
15ミリ秒かかるのに、リクエストごとに400ミリ秒かかる理由がわかりません。Springのオーバーヘッドのようです。:(