分页是几乎所有项目都要使用的一种方式,特别是B/S项目,而且分页基本上都是这些项目中的性能瓶颈。如果做一个好的分页机制对于项目是很重要的下面是一个代码中的分页的数据访问代码:
public DataTable GetFriend(long uIn, int onePageCount, int pageNo) {
///...
}
这些参数应该能够明白什么意思。但这个函数有什么问题呢?
1. 一般分页的代码都要知道总页数,所以如果使用这个函数,那么肯定还必须要有一个方法获取总页数,毫无疑问这个方法也是一个数据访问方法。这样导致每获取一页就需要两次访问数据库。
2. 这个方法获取一页数据,当用户翻页时就要不停的调用这个方法,而获取一页数据后紧接着获取下一页数据在系统运行时发生的概率是很大的,这样就造成大量的数据库访问。
3. 数据库访问的代价是比较高的,如果是本地数据库,问题还不是很严重。但大的系统基本上就是数据库分离的,这时网络传送的延迟比起内在访问那就不是一两个数据级的差距了。(这里还没考虑到分页时对大数据库系统的性能)现在大家可以讨论讨论怎么更进这些问题。
我在项目中对第一个问题的解决是通过下面的方式实现:
public DataTable GetFriend(long uIn, int onePageCount, int pageNo, out int TotalCount) {
///...
}
也就是在一次查询中同时获取这个数据表的记录数(这里是同时获取,而不是在这个方法中执行两次数据库访问,只要在原来的SQL语句上加上 sql+="SELECT COUNT(ID) FROM table WHERE...;"就可以了)
但是其它问题的解决确实比较困难。