更新时间:2023-11-21 gmt 08:00

通过java连接实例-凯发k8国际娱乐官网入口

本小节主要介绍使用java语言连接geminidb cassandra的基本操作。

前提条件

  • 已成功创建geminidb cassandra实例,且实例状态正常。创建geminidb cassandra实例的方法请参见购买实例
  • 已创建弹性云服务器,创建弹性云服务器的方法,请参见《弹性云服务器快速入门》中“创建弹性云服务器”章节。
  • 弹性云服务器上已经安装jdk环境。

操作步骤

  1. 获取geminidb cassandra实例的内网ip地址、端口。

    内网ip地址和端口的获取方法请参见。

  2. 登录弹性云服务器,具体操作请参见《弹性云服务器快速入门》中“”。
  3. 编辑连接geminidb cassandra实例的代码。
    import com.datastax.driver.core.*;
    cluster cluster = null;
    try {
        cluster = cluster.builder()                                                   
                .addcontactpoint("127.0.0.1")//此处为步骤1中获取到的geminidb cassandra实例的内网ip
                .withport(8635)        //此处为步骤1中获取到的geminidb cassandra实例的端口                   
                .build();
        session session = cluster.connect();                                           
        resultset rs = session.execute("select release_version from system.local");    
        row row = rs.one();
        system.out.println(row.getstring("release_version"));                          
    } finally {
        if (cluster != null) cluster.close();                                          
    }
  4. 运行示例代码,确认结果是否正常。

相关知识

  1. 创建集群实例。

    如下代码示例,可以快速创建一个集群实例:

    cluster cluster = cluster.builder()
            .withclustername("mycluster")   //集群名称可选
            .addcontactpoint("127.0.0.1")   // 连接点,业务连接集群时第一次连接的节点ip,可配置多个
            .build();
  2. 设置集群配置。

    必须要指定的选项是指定连接点(contactpoint),一般情况下建议配置三个连接点ip,这样当其中一个无法连接时,还可以尝试其他的连接点。

    可以配置的配置项有:

    • authprovider:认证方式
    • loadbalancingpolicy:负载均衡的策略。负载均衡策略决定了业务请求到cassandra集群的负载分流的方式, 建议设置为roundrobinpolicy,这样保持压力能够随机均匀的落在整个集群中。

      可选项有dcawareroundrobinpolicy,hostfilterpolicy,latencyawarepolicy,roundrobinpolicy,tokenawarepolicy和whitelistpolicy。

    • metrics:计量相关
    • nettyoptions:cassandra driver使用netty实现作为内部异步编程框架,所以暴露了一些options给用户自定义配置。
    • queryoptions:查询相关options,可以设置查询一致性级别、设置fetch_size、设置刷新节点拓扑频率、刷新元数据频率等。
    • reconnectionpolicy:当节点连接断开以后的重连策略,可以指定如下重连策略:
      • constantreconnectionpolicy:常数级别的重连策略
      • exponentialreconnectionpolicy:指数递增重连策略
    • retrypolicy:重试策略,当请求失败的时候,会根据指定的重试策略进行再次请求,默认为defaultretrypolicy。

      其他可选的重试策略还有:downgradingconsistencyretrypolicy,fallthroughretrypolicy,idempotenceawareretrypolicy和loggingretrypolicy,用户也可以根据业务自行定制重试策略。

  3. session会话。

    正常情况下,session和keyspace是不绑定的,所以在查询的时候是需要指定表的keyspace的,如下所示:

    session session = cluster.connect(); 
    session.execute("select * from mykeyspace.mytable where id = 1"); 
    //需要手动指定mykeysapce的keyspace前缀

    以下是几种绑定keysapce的常见方法:

    • 创建session会话时候指定keyspace
      session session = cluster.connect("mykeyspace");
    • 查询指定keyspace前缀
      session.execute("select * from otherkeyspace.othertable where id = 1");
    • session.execute 切换keyspace
      session.execute("use mykeyspace");
  4. crud(增删改查)操作
    • 直接使用cql语句实现增删改查操作
      //创建表 
      session.execute("create table test (k int,p int,s int ,v int,primary key (k, p));");
      //插入 
      session.execute("insert into test(k, p, v) values (0, 3, 1);");
      //查询 
      session.execute("select * from test;");
      //更新 
      session.execute("update test set v=100 where k = 0 and p = 3;")
      //删除 
      session.execute("delete from test where k = 0 and p = 3;")
    • 使用querybuilder
       //查询        
      resultset rs = session.execute(
                      querybuilder.select("k", "p", "v", "s")
                      .from("keyspace", "test")
                      .where(querybuilder.eq("k", 0))
                      .and(querybuilder.eq("p", 3));                      
      //插入        
      session.execute(
                      querybuilder.insertinto("keyspace", "test")
                      .values(new string[]{"k", "p", "v"},
                              new object[]{0, 3, 0}));                                
      //更新        
      session.execute(
                      querybuilder.update("keyspace", "test")
                      .with(querybuilder.set("v", 100))
                      .where(querybuilder.eq("k", 0))
                      .and(querybuilder.eq("p", 3));                
      //删除
      session.execute(querybuilder.delete()
                      .from("keyspace", "test")
                      .where(querybuilder.eq("k", 0))
                      .and(querybuilder.eq("p", 3))
    • 使用preparedstatement

      cassandra也有类似于jdbc那样使用预编译占位符,当使用preparedstatement的时候,cassandra server端会解析query语句并且在server端进行缓存,然后返回一个唯一标识符给cassandra driver。

      如下图所示:

      图1 原理图

      当用户绑定并且执行编译statement时,cassandra driver只会发送唯一标识符和数据,cassandra server会跳过解析query语句过程。

      图2 原理图

      预编译占位符在重复执行大量相同cql,只是数据不一样的场景性能上有很大优势。

      private static final string get_test = "select * from test where k = ? and p = ?;"; 
      private static final string insert_test = "insert into test(k, p, v) values (?, ?, ?);"; 
      private static final string update_test = "update test set v=100 where k = ? and p = ?;"; 
      private static final string delete_test = "delete from test where k = ? and p = ?;";
      //查询        
      preparedstatement preparestatement = session.prepare(get_test);        
      boundstatement bindstatement = new boundstatement(preparestatement).bind(0,3);        
      resultset rs = session.execute(bindstatement);
       //插入        
      preparedstatement preparestatement = session.prepare(insert_test);        
      boundstatement bindstatement = new boundstatement(preparestatement)
                  .bind(0, 3, 0);        
      session.execute(bindstatement);
      //更新        
      preparedstatement preparestatement = session.prepare(update_test);        
      boundstatement bindstatement = new boundstatement(preparestatement)
                  .bind(0, 3);        
      session.execute(bindstatement);                
      //删除        
      preparedstatement preparestatement = session.prepare(delete_test);        
      boundstatement bindstatement = new boundstatement(preparestatement)
                  .bind(0, 3);        
      session.execute(bindstatement);
  5. batch操作

    cassandra driver也支持用户批量进行插入操作,可以将多个statement添加进batchstatement统一执行。

    如下代码示例:

    session session = sessionrepository.getsession();                
    //插入        
    boundstatement insertbind = new boundstatement(
                    session.prepare("insert into keysapce.test(k, p, v) values(?,?,?);"))
                           .bind(0, 3, 0);        
    //更新        
    boundstatement updatebind = new boundstatement(
                    session.prepare("update keyspace.test set v=? where k=? and p=?;"))   
                        .bind(0, 3, 100");        
    //删除        
    boundstatement deletebind = new boundstatement(
                    session.prepare("delete from keyspace.test where k=? and p=?;"))
                           .bind(1, 3);        
    // geminidb cassandra只支持unlogged batch        
    batchstatement batchstatement = new batchstatement(type.unlogged);        
    batchstatement.add(insertbind);        
    batchstatement.add(updatebind);        
    batchstatement.add(deletebind);        
    session.execute(batchstatement);
分享:
网站地图