Python中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

共 (1) 个答案

  1. # 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