使用datastax映射器通过saveAsync

时间:2019-01-09 11:12:45

标签: java cassandra datastax mapper

我需要在尽可能短的时间内以可靠的方式保存数千条记录。由于我是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);
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

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

查看更多driver's documentation以获得更多详细信息。

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