Ant*_*arf 3 java asynchronous cassandra
我正在用我的表开发一个带有Cassandra的Java应用程序:
id | registration | name
1 1 xxx
1 2 xxx
1 3 xxx
2 1 xxx
2 2 xxx
... ... ...
... ... ...
100,000 34 xxx
Run Code Online (Sandbox Code Playgroud)
我的表行数非常多(超过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'
Run Code Online (Sandbox Code Playgroud)
但这是一个糟糕的模式.所以我用这种方式使用异步请求:
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);
}
Run Code Online (Sandbox Code Playgroud)
然后我将使用getUninterruptibly()
方法处理我的数据.
这是我的问题:我做的可能超过10,000,000 Casandra请求(每个'id'一个请求).我将所有这些结果放在Map中.
这会导致堆内存错误吗?处理这个问题的最佳方法是什么?
谢谢
注意:你的问题是"这是一个很好的设计模式".
如果您不得不执行10,000,000个cassandra数据请求,那么您的数据结构不正确.最终,您应该从头开始设计数据库,这样您只需要执行1-2次提取.
现在,如果你有5000个cassandra节点,这可能不是一个大问题(它可能仍然是),但它仍然是糟糕的数据库设计.我认为解决方案是看看你的架构.
归档时间: |
|
查看次数: |
69 次 |
最近记录: |