Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.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 BoundStatement真的比Cassandra中的SimpleStatement更有效吗?_Java_Cassandra 3.0 - Fatal编程技术网

Java BoundStatement真的比Cassandra中的SimpleStatement更有效吗?

Java BoundStatement真的比Cassandra中的SimpleStatement更有效吗?,java,cassandra-3.0,Java,Cassandra 3.0,我分别使用SimpleStatement和BoundStatement从Cassandra中选择数据100次。 我发现我的成绩没有太大提高 然而,他说: SimpleStatement:直接从字符串构建的简单实现。通常用于只执行一次或几次的查询。 BoundStatement:通过将值绑定到准备好的语句来获得。通常用于经常使用不同值执行的查询 在我的例子中,为什么SimpleStatement和BoundStatement的效率几乎相同 long start0 = System.curr

我分别使用SimpleStatement和BoundStatement从Cassandra中选择数据100次。
我发现我的成绩没有太大提高

然而,他说:

SimpleStatement:直接从字符串构建的简单实现。通常用于只执行一次或几次的查询。
BoundStatement:通过将值绑定到准备好的语句来获得。通常用于经常使用不同值执行的查询

在我的例子中,为什么SimpleStatement和BoundStatement的效率几乎相同

    long start0 = System.currentTimeMillis();
    long start;
    DataEntity mc = null;
    ResultSet results = null;
    BoundStatement bs = null;
    PK pk = null;
    CassandraData dao = new CassandraData();
    long end;
    Session session = dao.getSession();

    //SimpleStatement ss = new SimpleStatement("select * from test where E='"+pk.E+"' and D="+pk.D+" and M="+pk.M);

    PreparedStatement prepared = session.prepare(
            "select * from test where E=? and D=? and M=?");


    for (int i = 0; i < 100; i++) {
        start = System.currentTimeMillis();
        pk = ValidData.getOnePk();

        //results = session.execute(ss);

        bs = prepared.bind(pk.E, pk.D, pk.M);
        results = session.execute(bs);

        end = System.currentTimeMillis();
        logger.info("Show One:" + (end - start) / 1000.0 + "s elapsed.");
    }

    long end0 = System.currentTimeMillis();
    logger.info("Show All:" + (end0 - start0) / 1000.0 + "s elapsed.");
long start0=System.currentTimeMillis();
长起点;
DataEntity mc=null;
ResultSet results=null;
bounds=null;
PK=null;
CassandraData dao=新的CassandraData();
长端;
Session Session=dao.getSession();
//SimpleStatement ss=新SimpleStatement(“从测试中选择*,其中E=”“+pk.E+”,D=“+pk.D+”和M=“+pk.M”);
PreparedStatement prepared=session.prepare(
“从测试中选择*,其中E=?和D=?和M=?”;
对于(int i=0;i<100;i++){
start=System.currentTimeMillis();
pk=ValidData.getOnePk();
//结果=session.execute(ss);
bs=制备的结合物(pk.E,pk.D,pk.M);
结果=session.execute(bs);
end=System.currentTimeMillis();
info(“Show One:”+(结束-开始)/1000.0+“s已过”);
}
long-end0=System.currentTimeMillis();
logger.info(“全部显示:”+(end0-start0)/1000.0+“s已过”);

这是因为您的迭代次数太少了。100不足以看出区别

但最终他们都做了同样的工作,除了一句简单的话:

  • 只有一次到Cassandra节点的行程
  • 不会将任何准备好的语句存储在节点内存中
因此,BoundStatement的不同之处在于,您只需准备一次,绑定并执行多次

因此,一旦准备好BoundStatement,就只需通过连接发送绑定变量。而不是整个声明。因此,效率的差异应该由此而来

您还可以做的是启用跟踪并检查语句实际花费的时间和位置

对于测试,我建议在开始测量时间之前做一些热身。因为有很多因素实际上会影响结果

PD:我假设ValidData.getOnePk()返回随机数据,而您没有命中Cassandra行缓存