我们在项目中使用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保存在某些列表中,并在所有请求已发送)。

09-05 01:42