Spring DAO - 使用JdbcTemplate进行第一次查询需要更长的时间

时间:2012-08-28 11:28:18

标签: spring-mvc dao performance

在我的应用程序中,我使用带有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需要800ms,initialSize = 1需要400ms - 每个请求)。

我不明白为什么每个请求需要400毫秒时才可以持续15毫秒。这似乎是Spring的一些开销。 :(

3 个答案:

答案 0 :(得分:1)

您的DataSource是一个连接池。第一个查询需要连接。后续查询重用该连接。您可以将dbcp配置为预先创建一些连接,也可以在应用程序启动后立即手动连接和释放。

答案 1 :(得分:0)

查看javadocsourcegetExceptionTranslator()可能涉及一些工作要设置。也许您可以使用lazy-init参数控制何时进行该工作。

答案 2 :(得分:0)

我检查了连接池及其连接(initialSize)是在第一次调用时需要连接时创建的,然后它会在所有请求中重用,这就是它应该如何工作:),我也注意到了400ms的时间当同时有多个请求时,较低(约100毫秒)。我认为最初较长时间的原因是因为John Watts提到的建立TCP连接或者是因为一些Spring后台管理。