java - 提高 Cassandra 和 Java 集合的性能

标签 java collections cassandra nosql

我们在项目中使用 NoSQL (Cassandra)。我们有一个表 A(5000 条记录),它是一个主表。我们还有另一个表 B(2000 条记录)。表 B 有 4 列,表 A 有 25 列。我们暴露了一个 REST 服务来获取 B 的所有记录;像/service/getB。该服务将返回 6 列作为响应 -

{
    "result": [
        {
            "col1FromB": "1B",
            "col2FromB": "2B",
            "col3FromB": "3B",
            "col4FromB": "4B",
            "col1FromA": "1A",
            "col2FromA": "2A"
        },
        {
            "col1FromB": "11B",
            "col2FromB": "12B",
            "col3FromB": "13B",
            "col4FromB": "14B",
            "col1FromA": "11A",
            "col2FromA": "12A"
        }
    ]
}

因此,对于表 B 中的每个项目都有一个对表 A 的查找查询。我就是这样做的 –

    //Get all from Table B (took 90 ms in Local and 30 ms in Test)
    Select select = QueryBuilder.select().from("B");
    List<B> bList = cassandraOperations.select(select, B.class);

    //Loop through bList and do a lookup using id in Table A (took 46000 ms (46 sec) in Local (horrible) and 6000 ms (6 sec) in Test)
    For(B b: bList) {
    Select select = QueryBuilder.select(“col1FromA”, “col2FromA”).from("A");
    select.where(QueryBuilder.eq(“id”, b.getId()));
    A a = cassandraOperations.selectOne(select, A.class);

    ----
    ----
    //Prepare final Pojo with a and b objects and add into a List<finalPjo> and return
}

因此,在本地环境中查找时间非常长,在测试环境中也很不理想。我使用的只是 Java 集合。

有没有办法让它变得更好,以便我们在更短的时间内获得记录。

最佳答案

For(B b: bList) {
 Select select = QueryBuilder.select(“col1FromA”, “col2FromA”).from("A");
 select.where(QueryBuilder.eq(“id”, b.getId()));
 A a = cassandraOperations.selectOne(select, A.class);

此代码在每次迭代中执行阻塞请求cassandraOperations.selectOne,这意味着每次下一次迭代都必须等待上一次迭代。所有2000个请求都会一个一个的执行很长时间。

为避免这种情况,请使用异步方式在循环中获取记录(如我所见,您正在使用 Spring 并且 selectOne 可以替换为 selectOneAsynchronously 返回 ResultSetFuture,将这些 future 保存在某个列表中,并使用它来检索发送所有请求时记录)。

关于java - 提高 Cassandra 和 Java 集合的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471519/

相关文章:

java - 在 android.widget.AbsListView.contentFits(AbsListView.java :722)

java - 在 Java 7 中并行处理结果,使用非最终变量

java - 当应用程序崩溃时,Android App SharedPreferences 会被删除吗?

java - 将十六进制字节数组解码为特定代码页在随后编码时会带来错误的结果

java - 作为 CQL 的简单语句

c# - C# : restricting the type parameter to be a collection 中的泛型

javascript - Backbone collection.reset 添加了一个不正确的模型

java - 集合作为现实世界容器的隐喻

docker - 如何在 cassandra 的 docker 实例中启用用户定义的函数?

Cassandra 批处理准备语句大小警告