这几天在做一个项目的时候发现页面显示的数据量比较大,然后就想给它做一个分页的功能。本来哦,分页的原理是比较简单的。我所了解的大概有两种:内存分页和数据库分页。
内存分页就是一次性把所有的数据都查出来,然后将其缓存。在使用的时候传入页号就可以获得当前页的数据了。但是这个对内存的要求比较高,特别是大数据量的时候。而我的这个项目的数据量又确实比较大,所以当时就否定了这个方法。
数据库分页就是一次只查出一页的数据,然后需要的时候再进行一次查询。这种方式不同的数据库就有不同的实现了,如Oralce一般是采用rownum这个参数来控制,而Mysql可以采用limit来实现分页。当然肯定还有其他的方法,不过我没有了解过。虽然这样的话比较节省内存了,但是在数据库连接方面需要消耗较多的资源。不过就我当时的想法来说,我的第一选择就是这个。
既然选定了方案,就开始动手了。真的是想想简单啊,动手的时候发现还有好多的事情没考虑。当然也是个人习惯的问题,我一直不喜欢在url后面添加太多的参数。所以就只用了一个参数来表示请求的页面的页号。跑起来的时候发现即使只是分页,还是需要其他的一些参数。当时一想就把这些个参数放入到Session中,不过就为了一个简单的分页将数据缓存到Session貌似不太好。我纠结了好久,还是决定将参数写在url的后面。
本以为这样就可以了,不过数据显示出来才晓得,我的最终展现的数据在展现之前和数据库查询之后是做过处理的。除了去重以外还有一些格式的处理。这样显示的数据就远小于从数据库中查出的数据。本来我的PageSize定的是50,然后显示的时候可能只有几条了。悲剧啊!! 没想到还有这一手的,刚写好的要重新来过。
这个时候没什么心情写下去了,就去网上查了一下。发现了一个比较牛逼的标题:目前最好的JSP分页技术。点击进去看了下,确实讲的不错。有代码,有解释。看了以后我就想照着这个实现一下,选的是他说的最好的分页技术。不过把我整的是好惨的哦,因为光是重写ResultSet的所有方法都花了我半个多小时,然后还有其他的独有的方法。最后发现这个方法虽然有一定的好处,但是还是要不停的查数据库和我刚刚被证明不行的方案是一样的,更悲剧了我。
镇定思痛,我又重新考虑了一下分页的方案。其实也没什么好想的,只有第一种了。把数据取出来以后,存入到session中。接着就根据页号的不同来做处理了。这个快速的完成了。
写的一大推的乱七八糟的,说是技术研究还不如说是记流水账呢。不过我最想说的是:技术是很重要,它能实现我想的,但是找到真正可能的方案更重要,否则技术也找不到方向。