3

私のアプリケーションでは、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のオーバーヘッドのようです。:(

4

3 に答える 3

1

DataSource は接続プールです。最初のクエリは接続する必要があります。後続のクエリは接続を再利用します。いくつかの接続を事前に作成するように dbcp を構成するか、アプリの起動直後に手動で接続して解放することができます。

于 2012-08-28T11:36:47.980 に答える
0

javadocsourceを見てください。getExceptionTranslator()おそらく、設定するためのいくつかの作業が含まれます。たぶん、その作業がいつ発生するかをlazy-initパラメーターで制御できます。

于 2012-08-28T12:20:19.427 に答える
0

接続プールとその接続 (initialSize) が最初の呼び出し時に接続が必要なときに作成され、後ですべてのリクエストで再利用されることを確認しました。同時に複数のリクエストがある場合は約 100ms)。最初の時間が長くなった理由は、John Watts が述べたように TCP 接続を確立したためか、Spring のバックグラウンド管理によるものだと思います。

于 2012-08-28T14:55:28.357 に答える