【问题标题】:Cassandra C# driver manual paging not workingCassandra C#驱动程序手动分页不起作用
【发布时间】: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...");

    }

【问题讨论】:

    标签: c# cassandra datastax


    【解决方案1】:

    尝试将if (!rs2.IsFullyFetched) 替换为if (pagingState1 != null)

    禁用AutoPage 后,IsFullyFetched 方法总是返回true,因为它旨在与RowSet 的自动分页功能一起使用。

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 2020-07-18
      • 2018-09-23
      • 2022-08-10
      • 2017-06-25
      • 2018-01-20
      • 2018-04-24
      • 1970-01-01
      相关资源
      最近更新 更多