我正在使用带表的Cassandra开发Java应用程序:
id | registration | name
1 1 xxx
1 2 xxx
1 3 xxx
2 1 xxx
2 2 xxx
... ... ...
... ... ...
100,000 34 xxx
我的表有很多行(超过50,000,000)。我有一个myListIds
的一个String id
进行迭代。我可以使用:
SELECT * FROM table WHERE id IN (1,7,18, 34,...,)
//image more than 10,000,000 numbers in 'IN'
但这是一个错误的模式。所以相反,我以这种方式使用异步请求:
List<ResultSetFuture> futures = new ArrayList<>();
Map<String, ResultSetFuture> map = new HashMap<>();
// map : key = id & value = data from Cassandra
for (String id : myListIds)
{
ResultSetFuture resultSetFuture = session.executeAsync(statement.bind(id));
mapFutures.put(id, resultSetFuture);
}
然后,我将使用getUninterruptibly()
方法处理数据。
这是我的问题:我正在执行超过10,000,000个Casandra请求(每个“ id”请求一个)。我将所有这些结果放入地图中。
这会导致堆内存错误吗?处理该问题的最佳方法是什么?
谢谢
答案 0 :(得分:5)
注意:您的问题是“这是一种好的设计模式”。
如果您必须执行10,000,000个cassandra数据请求,那么您的数据结构不正确。最终,您应该从头开始设计数据库,以便只需要执行1-2次提取。
现在,当然,如果您有5000个cassandra节点,这可能不是一个大问题(可能仍然是),但是它仍然存在不良数据库设计的麻烦。我认为解决方案是看一下您的架构。
答案 1 :(得分:0)
我发现您的代码存在以下问题:
可能的解决方案是按块限制异步请求和处理数据的数量。(例如,参见this answer )