如何解决Cassandra C#驱动程序手动分页不起作用
我正在尝试使用C#在Cassandra中使用手动分页。
以下是版本详细信息:
它是驱动程序版本3.11.0
我的服务器版本为[cqlsh 5.0.1 |卡桑德拉3.11.4 | CQL规范3.4.4 |原生协议v4]
下面是我正在尝试的代码
var cluster = Cluster.Builder()
.AddContactPoints("x.x.x.x","x.x.x.x","x.x.x.x")
.WithCompression(CompressionType.Snappy)
.Build();
var session = cluster.Connect("shekhar");
var statement = new SimpleStatement("select * from table ALLOW FILTERING");
statement.SetAutoPage(false);
statement.SetPageSize(1000);
var rs = await session.ExecuteAsync(statement);
int rowNo = 0;
foreach (var row in rs)
Console.WriteLine("{0}: Cooment has Id {1},has tweet {2}",rowNo++,row.GetValue<BigInteger>("id"),row.GetValue<string>("xxx"));
//rs.FetchMoreResults();
//Console.WriteLine(rs.IsExhausted());
//Console.WriteLine(rs.IsFullyFetched);
//Console.WriteLine(rs.PagingState);
通过设置 statement.SetAutoPage(false); ,它只能获取一页。
最后一个语句Console.WriteLine(rs.IsFullyFetched);
和Console.WriteLine(rs.IsFullyFetched);
的值是true
,因此也使用它们并没有什么区别。
我也遵循https://docs.datastax.com/en/developer/csharp-driver/3.13/features/paging/部分中的建议,在下一条语句中使用了PagingState
。
使用它可以一次又一次地提取旧数据。
这是我的实现方法
var statement = new SimpleStatement("select * from table ALLOW FILTERING");
statement.SetAutoPage(false);
statement.SetPageSize(1000);
int rowNum = 0;
await GetAllData_PagedData(session,statement,null,rowNum);
Console.ReadLine();
static async Task GetAllData_PagedData(ISession session,IStatement statement,byte[] pagingState,int rowNum)
{
var statement2 = statement
.SetPagingState(pagingState);
var rs2 = session.Execute(statement2);
var pagingState1 = rs2.PagingState;
foreach (var row in rs2)
{
Console.WriteLine("{0}: Cooment has Id {1},rowNum++,row.GetValue<string>("column2"));
}
if (!rs2.IsFullyFetched)
await GetAllData_PagedData(session,statement2,pagingState1,rowNum);
else
Console.WriteLine("All Data fetched...");
}
解决方法
尝试将if (!rs2.IsFullyFetched)
替换为if (pagingState1 != null)
。
在禁用AutoPage
的情况下,IsFullyFetched
方法始终返回true
,因为它与RowSet
的自动分页功能一起使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。