Spring与Ibatis在分页性能上的优化 收藏
在Spring Dao中使用Ibatis返回分页记录集时,一般是采用如下方式可以很方便完成任务:
- public List<Cxryxx> getList(HashMap<String, Object> hashMap, int skip,
- int max) throws DataAccessException {
- return getSqlMapClientTemplate().queryForList("getCxryxxList", hashMap,
- skip, max);
- }
但在数据表中记录数比较大,超过百万时,返回的速度不堪忍受。
后来在改进了statement语句,在statement上控制分页,原来的statement
- <statement id="getCxryxxList" resultMap="result">
- select * from cxryxx
- </statement>
改进后
- <statement id="getCxryxxList" resultMap="result">
- select * from cxryxx
- <dynamic prepend="limit">
- #limit#
- </dynamic>
- <dynamic prepend="offset">
- #offset#
- </dynamic>
- </statement>
前提是数据库要支持 limit 和 offset。
然后在DAO再增加不带skip和max的getList方法。
- public List<Cxryxx> getList(HashMap<String, Object> hashMap)
- throws DataAccessException {
- return getSqlMapClientTemplate().queryForList("getCxryxxList", hashMap);
- }
使用时,只需把limit和offset的值写到hashMap上就行了。
改进后,执行180万数据量的分页,取第1页分页数据时,原来需要20秒以上的执行速度,现在只需1秒不到。分页数增大时,所需的时间也会相应更多,但比原来的方法,节约了不少时间。