Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的Cassandra Prepared语句接收数据的速度如此之慢?_Java_Cassandra_Datastax Enterprise - Fatal编程技术网

Java 为什么我的Cassandra Prepared语句接收数据的速度如此之慢?

Java 为什么我的Cassandra Prepared语句接收数据的速度如此之慢?,java,cassandra,datastax-enterprise,Java,Cassandra,Datastax Enterprise,我有一个包含100000个名称的Java列表,我想将其吸收到一个运行Datastax Enterprise 5.1和Cassandra 3.10.0的3节点Cassandra集群中 我的代码接受了,但需要很长时间。我在集群上运行了一个压力测试,每秒能够完成25000次写操作。通过我的摄取代码,我得到了大约每秒200次的糟糕表现 我的Java列表中有100000个名称,称为myList。我使用下面准备好的语句和会话执行来接收数据 PreparedStatement prepared = sessi

我有一个包含100000个名称的Java列表,我想将其吸收到一个运行Datastax Enterprise 5.1和Cassandra 3.10.0的3节点Cassandra集群中

我的代码接受了,但需要很长时间。我在集群上运行了一个压力测试,每秒能够完成25000次写操作。通过我的摄取代码,我得到了大约每秒200次的糟糕表现

我的Java列表中有100000个名称,称为myList。我使用下面准备好的语句和会话执行来接收数据

PreparedStatement prepared = session.prepare("insert into names (id, name) values (?, ?)");

         int id = 0;

         for(int i = 0; i < myList.size(); i++) {
             id += 1;
             session.execute(prepared.bind(id, myList.get(i)));
        }
监控5秒输出显示了3次迭代的以下内容:

/192.168.20.25:9042 connections=1, current load=1, maxload=32768
/192.168.20.26:9042 connections=1, current load=0, maxload=32768
/192.168.20.34:9042 connections=1, current load=0, maxload=32768
/192.168.20.25:9042 connections=1, current load=1, maxload=32768
/192.168.20.26:9042 connections=1, current load=0, maxload=32768
/192.168.20.34:9042 connections=1, current load=0, maxload=32768
/192.168.20.25:9042 connections=1, current load=0, maxload=32768
/192.168.20.26:9042 connections=1, current load=1, maxload=32768
/192.168.20.34:9042 connections=1, current load=0, maxload=32768
我似乎没有很有效地利用集群。我不确定我做错了什么,如果有任何提示,我将不胜感激


谢谢大家!

使用executeAsync。

异步执行提供的查询。此方法不会阻塞。一旦查询被传递到底层网络堆栈,它就会返回。特别是,从该方法返回并不能保证查询有效,甚至不能保证查询已提交到活动节点。访问ResultSetFuture时,将引发与查询失败相关的任何异常

您正在插入大量数据。如果您使用executeAsync,而您的集群无法处理如此多的数据,它可能会引发异常。您可以使用信号量限制executeAsync

例如:

PreparedStatement prepared = session.prepare("insert into names (id, name) values (?, ?)");

int numberOfConcurrentQueries = 100;
final Semaphore semaphore = new Semaphore(numberOfConcurrentQueries);

int id = 0;    

for(int i = 0; i < myList.size(); i++) {
    try {
        id += 1;
        semaphore.acquire();
        ResultSetFuture future = session.executeAsync(prepared.bind(id, myList.get(i)));
        Futures.addCallback(future, new FutureCallback<ResultSet>() {
            @Override
            public void onSuccess(ResultSet result) {
                semaphore.release();
            }

            @Override
            public void onFailure(Throwable t) {
                semaphore.release();
            }
        });
    } catch (Exception e) {
        semaphore.release();
        e.printStackTrace();
    }
}
PreparedStatement prepared=session.prepare(“插入名称(id,name)值(?,)”;
int numberOfConcurrentQueries=100;
最终信号量信号量=新信号量(numberOfConcurrentQueries);
int id=0;
对于(int i=0;i
来源:

使用executeAsync。

异步执行提供的查询。此方法不会阻塞。一旦查询被传递到底层网络堆栈,它就会返回。特别是,从该方法返回并不能保证查询有效,甚至不能保证查询已提交到活动节点。访问ResultSetFuture时,将引发与查询失败相关的任何异常

您正在插入大量数据。如果您使用executeAsync,而您的集群无法处理如此多的数据,它可能会引发异常。您可以使用信号量限制executeAsync

例如:

PreparedStatement prepared = session.prepare("insert into names (id, name) values (?, ?)");

int numberOfConcurrentQueries = 100;
final Semaphore semaphore = new Semaphore(numberOfConcurrentQueries);

int id = 0;    

for(int i = 0; i < myList.size(); i++) {
    try {
        id += 1;
        semaphore.acquire();
        ResultSetFuture future = session.executeAsync(prepared.bind(id, myList.get(i)));
        Futures.addCallback(future, new FutureCallback<ResultSet>() {
            @Override
            public void onSuccess(ResultSet result) {
                semaphore.release();
            }

            @Override
            public void onFailure(Throwable t) {
                semaphore.release();
            }
        });
    } catch (Exception e) {
        semaphore.release();
        e.printStackTrace();
    }
}
PreparedStatement prepared=session.prepare(“插入名称(id,name)值(?,)”;
int numberOfConcurrentQueries=100;
最终信号量信号量=新信号量(numberOfConcurrentQueries);
int id=0;
对于(int i=0;i
来源:

您为什么需要id?成功计数?id是分区键此代码似乎有点不完整:使用
numberOfConcurrentQueries
Permissions、
1
acquire和
myList.size()
释放创建的信号量。。。而且我从来不会用信号灯来完成这样的任务。对我来说,一个普通的计数器就足够了。@xmas79谢谢,答案已编辑。为什么需要id?成功计数?id是分区键此代码似乎有点不完整:使用
numberOfConcurrentQueries
Permissions、
1
acquire和
myList.size()
释放创建的信号量。。。而且我从来不会用信号灯来完成这样的任务。对我来说,一个普通的计数器就足够了。@xmas79谢谢,答案已编辑。