我正在用cassandra和我的表开发一个java应用程序:
id | registration | name
1 1 xxx
1 2 xxx
1 3 xxx
2 1 xxx
2 2 xxx
... ... ...
... ... ...
100,000 34 xxx
我的表有非常多的行(超过50000000行)。我有一个 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()
方法。
这里是我的问题:我正在做可能超过10000000个casandra请求(每个'id'一个请求)。我把这些结果都放在Map上。
这会导致堆内存错误吗?最好的办法是什么?
谢谢您
2条答案
按热度按时间svmlkihl1#
注意:你的问题是“这是一个好的设计模式吗?”。
如果您必须执行10000000个cassandra数据请求,那么您的数据结构不正确。最终,您应该从头开始设计数据库,以便只需执行1-2次获取。
当然,如果您有5000个cassandra节点,这可能不是一个大问题(可能仍然是),但它仍然散发着糟糕的数据库设计的味道。我认为解决办法是看看你的模式。
8nuwlpux2#
我发现您的代码存在以下问题:
过载的cassandra集群,它将无法处理如此多的异步请求,并且您的请求将失败,并出现nohostavailableexception
由于cassadra驱动程序过载,您的客户端应用程序将因io异常而失败,因为系统将无法处理如此多的异步请求(请参阅有关连接优化的详细信息)https://docs.datastax.com/en/developer/java-driver/3.1/manual/pooling/)
是的,内存问题是可能的。这取决于数据大小
可能的解决方案是限制异步请求的数量,并按块处理数据