在我的应用程序中,我使用带有 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 似乎有些开销。:(