在我的应用程序中,我使用带有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的一些开销。 :(
答案 0 :(得分:1)
您的DataSource是一个连接池。第一个查询需要连接。后续查询重用该连接。您可以将dbcp配置为预先创建一些连接,也可以在应用程序启动后立即手动连接和释放。
答案 1 :(得分:0)
答案 2 :(得分:0)
我检查了连接池及其连接(initialSize)是在第一次调用时需要连接时创建的,然后它会在所有请求中重用,这就是它应该如何工作:),我也注意到了400ms的时间当同时有多个请求时,较低(约100毫秒)。我认为最初较长时间的原因是因为John Watts提到的建立TCP连接或者是因为一些Spring后台管理。