java使用卡桑德拉如何实现分页?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
<强>一、设置抓取大小(设置获取大小)强>
抓取大小指的是一次从卡桑德拉获取到的记录数,换句话说,就是每一页的记录数;我们能够在创建集群实例的时候给它的获取大小指定一个默认值,如果没有指定,那么默认是5000
//初始化: 集群的集群=Cluster.builder () .addContactPoint (“127.0.0.1") .withQueryOptions(新QueryOptions () .setFetchSize (2000)) .build ();//或在运行时: .setFetchSize .getQueryOptions cluster.getConfiguration()()(2000年),
另外,声明上也能设置取大小
=new语句声明SimpleStatement(“你query"); statement.setFetchSize (2000),
如果声明上设置了获取大小,那么声明的获取大小将起作用,否则则是集群上的获取大小起作用。
注意:设置了获取大小并不意味着卡桑德拉总是返回准确的结果集(等于获取大小),它可能返回比获取大小稍微多一点或者少一点的结果集。
获取大小限制了每一页返回的结果集的数量,如果你迭代某一页,驱动会在后台自动的抓取下一页的记录。如下例,取大?20:
,
默认情况下,后台自动抓取发生在最后一刻,也就是当某一页的记录被迭代完的时候。如果需要更好的控制,ResultSet接口提供了以下方法:
getAvailableWithoutFetching()和isFullyFetched()来检查当前状态;
fetchMoreResults()强制页面获取;
以下是如何使用这些方法提前预取下一页,以避免在某一页迭代完后才抓取下一页造成的性能下降:
ResultSet rs=session.execute(“你query"); (一行一行:rs) { 如果(rs.getAvailableWithoutFetching ()==100,,! rs.isFullyFetched ()) rs.fetchMoreResults ();//这是异步的//处理行…… System.out.println(行); }
有时候,将分页状态保存起来,对以后的恢复是非常有用的,想象一下:有一个无状态Web服务,显示结果列表,并显示下一页的链接,当用户点击这个链接的时候,我们需要执行与之前完全相同的查询,除了迭代应该从上一页停止的位置开始;相当于记住了上一页迭代到了哪了,那么下一页从这里开始即可。
为此,驱动程序会暴露一个PagingState对象,该对象表示下一页被提取时我们在结果集中的位置。
ResultSet ResultSet=session.execute(“你query");//遍历结果集… .getPagingState PagingState PagingState=resultSet.getExecutionInfo () ();//PagingState对象可以被序列化成字符串或字节数组 字符串的字符串=pagingState.toString (); byte[]字节=pagingState.toBytes ();
PagingState对象被序列化后的内容可以持久化存储起来,也可用作分页请求的参数,以备后续再次被利用,反序列化成对象即可:
PagingState.fromBytes (byte[]字节); PagingState.fromString (String str);
请注意,分页状态只能使用完全相同的语句重复使用(相同的查询,相同的参数),而且,它是一个不透明的值,只是用来存储一个可以被重新使用的状态值,如果尝试修改其内容或将其使用在不同的语句上,驱动程序会抛出错误。
具体我们来看下代码,下例是模拟页面分页的请求,实现遍历老师表中的全部记录:
接口:
进口java.util.Map; 进口com.datastax.driver.core.PagingState; 公共接口ICassandraPage { Object> Map<字符串;页面(PagingState PagingState); }
主体代码:
进口java.util.ArrayList; 进口java.util.HashMap; 进口并不知道; 进口java.util.Map; 进口com.datastax.driver.core.PagingState; 进口com.datastax.driver.core.ResultSet; 进口com.datastax.driver.core.Row; 进口com.datastax.driver.core.Session; 进口com.datastax.driver.core.SimpleStatement; 进口com.datastax.driver.core.Statement; 进口com.huawei.cassandra.dao.ICassandraPage; 进口com.huawei.cassandra.factory.SessionRepository; 进口com.huawei.cassandra.model.Teacher; 公共类CassandraPageDao实现ICassandraPage { 私有静态最终会议会话=SessionRepository.getSession (); 私有静态最终字符串CQL_TEACHER_PAGE=皊elect * from mycas.teacher;“; @Override 公共Mapjava使用卡桑德拉如何实现分页