【发布时间】:2020-12-29 14:47:38
【问题描述】:
我正在尝试使用 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}, has tweet {2}", rowNum++, row.GetValue<BigInteger>("id"), row.GetValue<string>("column2"));
}
if (!rs2.IsFullyFetched)
await GetAllData_PagedData(session, statement2, pagingState1, rowNum);
else
Console.WriteLine("All Data fetched...");
}
【问题讨论】: