【问题标题】:Cassandra Datastax driver not returning rows via prepareCassandra Datastax 驱动程序未通过准备返回行
【发布时间】:2013-07-03 23:41:00
【问题描述】:

我正在使用 Cassandra 1.2.5 和二级索引。当我运行准备好的语句时,没有返回数据。我有数据。同样对于索引列,我确实有重复值。我正在做的是根据 user_id 重新生成 video_id 列表。表描述如下所示: [default@video] 描述视频;

警告:“描述”输出中有意省略了 CQL3 表。 详情请见https://issues.apache.org/jira/browse/CASSANDRA-4377

ColumnFamily: videos
  Key Validation Class: org.apache.cassandra.db.marshal.IntegerType
  Default column value validator: org.apache.cassandra.db.marshal.IntegerType
  Columns sorted by: org.apache.cassandra.db.marshal.UTF8Type
  GC grace seconds: 864000
  Compaction min/max thresholds: 4/32
  Read repair chance: 0.1
  DC Local Read repair chance: 0.0
  Populate IO Cache on flush: false
  Replicate on write: true
  Caching: ALL
  Bloom Filter FP chance: default
  Built indexes: [videos.videos_user_id_idx]
  Column Metadata:
    Column Name: video_id
      Validation Class: org.apache.cassandra.db.marshal.IntegerType
    Column Name: user_id
      Validation Class: org.apache.cassandra.db.marshal.IntegerType
      Index Name: videos_user_id_idx
      Index Type: KEYS
  Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
  Compression Options:
    sstable_compression: org.apache.cassandra.io.compress.SnappyCompressor

我的代码如下所示: int并发= 3; //final BoundStatement query = null; 尝试 { // 创建与主机的会话 Cluster cluster = new Cluster.Builder().addContactPoints(String.valueOf("localhost")).build();

           // final int maxRequestsPerConnection = 10;
          //  int maxConnections = concurrency / maxRequestsPerConnection + 1;

            int maxConnections = 3;
            PoolingOptions pools = cluster.getConfiguration().getPoolingOptions();
            pools.setMaxSimultaneousRequestsPerConnectionThreshold(HostDistance.LOCAL, concurrency);
            pools.setCoreConnectionsPerHost(HostDistance.LOCAL, maxConnections);
            pools.setMaxConnectionsPerHost(HostDistance.LOCAL, maxConnections);
            pools.setCoreConnectionsPerHost(HostDistance.REMOTE, maxConnections);
            pools.setMaxConnectionsPerHost(HostDistance.REMOTE, maxConnections);


            Session session = cluster.connect();


            //get list of video ids
            String cql1 = "SELECT video_id from video.videos WHERE user_id=?";
            com.datastax.driver.core.PreparedStatement stmt = session.prepare(cql1);
            BoundStatement b = stmt.bind();
            BigInteger i = BigInteger.valueOf(9);
            b.setVarint("user_id",i);
            long start, end;                
            start = System.nanoTime();
            com.datastax.driver.core.ResultSet rs1 = session.execute(b);
            end = System.nanoTime();
            System.out.println("Datastax driver CQL Query prepared overall time ns:"
                    + (end - start));

            while(rs1.iterator().hasNext()) {
                 System.out.println("user_id:" + rs1.iterator().next().getVarint("video_id"));
           }

请注意,即使我更改语句以替换 ?值为 9 我仍然没有返回任何行。

任何想法我做错了什么??

谢谢, -托尼

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    试试这个代码来检索数据:

    Cluster cluster = Cluster.builder()
                                     .addContactPoint("127.0.0.1")
                                  // .addContactPoint("some.other.ip")
                                     .build();
    Session session = cluster.connect();
    
    String statement = "SELECT * FROM pixel.user;";
    // String statement = "SELECT video_id from video.videos WHERE user_id=9";
    
    session.execute(statement);
    ResultSet rs = session.execute(statement);
    for(Row r : rs.all())
        System.out.println(r.toString());
    

    一旦你掌握了基础知识,就该绑定语句了:

    int user_id = 9;
    String statement = "SELECT * from video.videos WHERE user_id=?";
    PreparedStatement pStatement = session.prepare(statement);
    BoundStatement boundStatement = new BoundStatement(pStatement);
    
    PreparedStatement ps = session.prepare(statement);
    BoundStatement bs = ps.bind();
    bs.bind(user_id); // a csv list: bs.bind(9, "string val of second ?, etc...");
    
    // session.execute(bs);
    ResultSet rs = session.execute(bs);
    

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 2021-02-09
      • 2015-06-23
      • 2016-02-27
      • 2017-01-20
      • 2014-05-04
      • 2013-05-31
      • 2017-06-23
      • 2013-09-06
      相关资源
      最近更新 更多