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 毫秒 - 每个请求)。

我不明白为什么每个请求都需要 400 毫秒,而可能需要 15 毫秒。Spring 似乎有些开销。:(

4

3 回答 3

1

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

于 2012-08-28T11:36:47.980 回答
0

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

于 2012-08-28T14:55:28.357 回答
0

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

于 2012-08-28T12:20:19.427 回答