簡體   English   中英

Cassandra通過線程池檢索數據

[英]Cassandra retrieving data through a thread pool

我是Cassandra的新手,我正在嘗試使用通過執行程序池執行的准備好的語句來檢索數據。 看來我收到的數據不一致。

我有這個user_connections表,其中user_id是行鍵,friends_id列表作為設置列。 我有另一個表,friends_info表,其中friend_id是行鍵,所有其他信息都作為列。

當嘗試檢索用戶AA的朋友列表時,我正在檢索BBB,CCC,DDD的朋友列表。 很好。

當嘗試使用准備好的語句通過執行程序池檢索BBB,CCC,DDD時。 數據不一致。 有時所有三個記錄都是BBB,有時所有三個記錄都是,有時兩個記錄是BBB,一個是CCC等...

我提供了我正在使用的方法和相關的類,請您幫我一下。 我知道准備好的語句是線程安全的,並且有望按預期工作。

public Set<User> listUserConnections(String userId) {
    Session session = client.getSession();

    Set<String> listUserConnectionIds = listUserConnections(userId, session);

    if (listUserConnectionIds.size() == 0)
        return new HashSet<User>();



    Set<User> listConnectionUserDetails = retrieveUserConnectionProfileInfo(
            listUserConnectionIds, session);
    return listConnectionUserDetails;

}



private Set<User> retrieveUserConnectionProfileInfo(Set<String> listUserConnectionIds,
        Session session) {


    Set<Callable<User>> callables = new HashSet<Callable<User>>();


     for(String key:listUserConnectionIds){



        logger.info("about to add callable" + key);

        Callable<User> callable = new QueryTask(key);

        callables.add(callable);

    }
    // invoke in parallel
    List<Future<User>> futures;
    Set<User> users = new HashSet<User>();

    // TODO Revisit this
    ExecutorService executorPool = Executors.newFixedThreadPool(100);

    try {
        futures = executorPool.invokeAll(callables);
        for (Future<User> f : futures) {

            User user = f.get();
            users.add(user);

            logger.info("User from future"+user.getUserId());

        }
    } catch (ExecutionException e) {
        logger.error("Error in retrieving the stores in parallel ", e);
    } catch (InterruptedException e) {
        logger.error("Error in retrieving the stores in parallel as it was interrupted ", e);
    } finally {
        executorPool.shutdown();
    }

    return users;
}

//執行器池類

class QueryTask implements Callable<User> {

    private String userName;

    // final PreparedStatement statement =
    // client.getSession().prepare(QueryConstants.GET_ALL_STORE_BRANDS);

    QueryTask(String name) {
        this.userName = name;

    }

    @Override
    public User call() throws Exception {
        // -------------I am seeing the userName is correct------------- for example BBB
        logger.info("inside call processing queries for " + userName);

        //------------This is a prepared statement, userPreparedStatement.getbStUserInfo()
        BoundStatement bStUserInfo = userPreparedStatement.getbStUserInfo();
        bStUserInfo.bind(userName);
        Session session = client.getSession();
        ResultSet rs = session.execute(bStUserInfo);

        User user = new User();

        Iterator<Row> rowIterator = rs.iterator();
        while (rowIterator.hasNext())
        {
        Row row = rowIterator.next();

        //-------This user id is not right 
        logger.info("Inside the callable after retrieval"+row.getString(TableConstants.Users.COLUMN_NAME_USER_ID));
        user.setUserId(row.getString(TableConstants.Users.COLUMN_NAME_USER_ID));



        return user;
        }

        logger.info("outside the while loop");
        return user;

    }

}

非常感謝@Ralf和Alex Popescu在此方面給我回復。 Datastax的文檔深入探討了Aync調用的工作方式。

@ Alex Popescu。 謝謝,我嘗試了他們的aync電話,對我來說效果很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM