Cassandra、Java和许多异步请求:这样好吗?
我正在用Cassandra和我的表开发Java应用程序:Cassandra、Java和许多异步请求:这样好吗?,java,asynchronous,cassandra,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 3
id | registration | name
1 1 xxx
1 2 xxx
1 3 xxx
2 1 xxx
2 2 xxx
... ... ...
... ... ...
100,000 34 xxx
我的表有很多行(超过50000000行)。我有一个myListIds
的stringid
要迭代。我可以使用:
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);
}
List futures=new ArrayList();
Map Map=newhashmap();
//映射:key=id&value=来自Cassandra的数据
用于(字符串id:MyListId)
{
ResultSetFuture ResultSetFuture=session.executeAsync(statement.bind(id));
put(id,resultSetFuture);
}
然后我将使用getunterruptibly()
方法处理我的数据
这里是我的问题:我正在做可能超过10000000个Casandra请求(每个“id”一个请求)。我把所有这些结果放在一张地图里
这会导致堆内存错误吗?最好的办法是什么
谢谢注意:您的问题是“这是一种好的设计模式吗?”
如果您必须执行10000000个cassandra数据请求,那么您的数据结构不正确。最终,您应该从头开始设计数据库,以便只需执行1-2次抓取
当然,如果您有5000个cassandra节点,这可能不是一个大问题(可能仍然是),但它仍然散发着糟糕的数据库设计的气味。我认为解决方案是查看您的模式。我发现您的代码存在以下问题:
可能的解决方案是限制异步请求的数量,并按块处理数据。(例如,请参阅)听起来像是一个让您产生大量开销的解决方案。我想知道,如果以某种方式处理1K ID是否更有意义。处理数以百万计的请求肯定会产生大量的开销。你应该弄清楚你到底需要什么。你需要你创建的
地图
,还是只是一个你以后会扔掉的中间对象?您是否需要一起处理所有数据,或者可以成批处理,甚至一个一个?