java—使用datastax mapper使用saveasync保存数千条记录是个好主意吗

sg2wtvxw  于 2021-06-14  发布在  Cassandra
关注(0)|答案(1)|浏览(304)

我需要在尽可能短的时间内以可靠的方式保存数千条记录。由于我是datastax驱动程序的新手,所以我不知道对cassandra执行批量写入的最佳方法
所有的记录都属于一个对硫磷(这里不考虑复制),记录数可能从250到25000不等

public void save(List<CassandraResource> listOfCassandraResource) 
{
    Mapper<CassandraResource> mapper = this.mappingManager.mapper(CassandraResource.class, this.keyspace);
    mapper.setDefaultSaveOptions(Option.saveNullFields(false));
    for (CassandraResource resource: listOfCassandraResource)
    {
        ListenableFuture<Void> future = mapper.saveAsync(resource);
    }
}
jv2fixgn

jv2fixgn1#

是的,使用异步查询是标准模式。您只需注意不要使系统过载—驱动程序对每个连接/主机的飞行中请求数有限制,默认值为1024。您需要将每个连接的最大飞行中请求数增加到合理的值(最大32k)。
这可以在您配置 Cluster 对象,或在运行时:

PoolingOptions poolingOptions = new PoolingOptions();
poolingOptions.setMaxRequestsPerConnection(HostDistance.LOCAL, 32768);
Cluster cluster = Cluster.builder().withContactPoints("...")
     .withPoolingOptions(poolingOptions).build();

有关详细信息,请参阅更多驱动程序文档。
如果您有更多的数据,那么您可能需要使用某种信号量等来防止提交过多的请求。你可以在这里看到一个例子。

相关问题