java使用卡桑德拉如何实现分页

  

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:

癹ava使用卡桑德拉如何实现分页”,

默认情况下,后台自动抓取发生在最后一刻,也就是当某一页的记录被迭代完的时候。如果需要更好的控制,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
  公共Map

java使用卡桑德拉如何实现分页