我需要在尽可能短的时间内以可靠的方式保存数千条记录。由于我是datastax驱动程序的新手,所以我不知道在Cassandra上执行BULK写入的最佳方法

所有记录都属于单个对硫磷(此处不考虑复制)
记录数可能从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);
    }
}

最佳答案

是的,使用异步查询是标准模式。您只需要注意不要使系统超载-驱动程序会限制每个连接/主机的运行中请求数,默认情况下为1024。您需要将每个连接的进行中请求的最大数量增加到某个合理的值(最大32k)。

这可以在配置Cluster对象时或在运行时完成:

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


有关更多详细信息,请参见更多driver's documentation

如果您有更多的数据,则可能需要使用某种信号量等,以防止提交过多的请求。您可以看到示例之一here

关于java - 使用datastax映射器通过saveAsync保存数千条记录是否是一个好主意,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54108833/

10-16 10:59
查看更多