13.6.3 离线RowSet的查询分页
由于CachedRowSet
会将数据记录直接装载到内存中,因此如果SQL
查询返回的记录过大CachedRowSet
将会占用大量的内存,在某些极端的情况下,它甚至会直接导致内存溢出。
为了解决该问题, CachedRowSet
提供了分页功能。所谓分页功能就是一次只装载Resultset
里的某几条记录,这样就可以避免CachedRowSet
占用内存过大的问题。
CachedSet
提供了如下方法来控制分页。
方法 |
描述 |
populate(Resultset rs, int startRow) |
使用给定的Resultset 装填RowSet ,从Resultset 的第startRow 条记录开始装填。 |
setPageSize(int pageSize) |
设置CachedRowSet 每次返回多少条记录。 |
previousPage() |
在底层Resultset 可用的情况下,让CachedSet 读取上一页记录。 |
nextPage() |
在底层Resultset 可用的情况下,让CachedRowSet 读取下一页记录。 |
下面程序示范了CachedRowSet
的分页支持。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| import java.util.*; import java.io.*; import java.sql.*; import javax.sql.*; import javax.sql.rowset.*;
public class CachedRowSetPage { private String driver; private String url; private String user; private String pass; public void initParam(String paramFile) throws Exception { Properties props = new Properties(); props.load(new FileInputStream(paramFile)); driver = props.getProperty("driver"); url = props.getProperty("url"); user = props.getProperty("user"); pass = props.getProperty("pass"); }
public CachedRowSet query(String sql, int pageSize, int page) throws Exception { Class.forName(driver); try ( Connection conn = DriverManager.getConnection(url, user, pass); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { RowSetFactory factory = RowSetProvider.newFactory(); CachedRowSet cachedRs = factory.createCachedRowSet(); cachedRs.setPageSize(pageSize); cachedRs.populate(rs, (page - 1) * pageSize + 1); return cachedRs; } } public static void main(String[] args) throws Exception { CachedRowSetPage cp = new CachedRowSetPage(); cp.initParam("mysql.ini"); CachedRowSet rs = cp.query("select * from student_table", 3, 2); while (rs.next()) { System.out.println(rs.getString(1) + "\t" + rs.getString(2) + "\t" + rs.getString(3)); } } }
|
CachedRowSet
实现分页的关键代码如下:
1 2 3 4
| cachedRs.setPageSize(pageSize);
cachedRs.populate(rs, (page - 1) * pageSize + 1);
|
程序中①号代码显示要査询第2页的记录,每页显示3条记录。运行上面程序,可以看到程序只会显示从第4行到第6行的记录,这就实现了分页。