OceanBase TableAPI实践案例(Rust)

news2024/12/24 8:30:35

引子

这是OceanBase TableAPI实践案例(Java)的姊妹篇,上一篇比较全面的比较全面的介绍了TableAPI的相关概念,以及基本的环境搭建,因此这篇不再赘述。本文将主要介绍TableAPI的Rust客户端obkv-table-client-rs ,因为这个开源项目相关说明较少,初学者可能未必能够直接上手操作,所以可以将本文内容作为该项目的增强版README。

想更好的理解本文内容需要有Rust语言基础、OceanBase基础、了解TableAPI工作原理。

注:为了不增加冗余篇幅,请提前阅读TableAPI官方文档***、******OceanBase TableAPI实践案例(Java)***两篇文章。

环境准备

假设按照OceanBase TableAPI实践案例(Java)中的方法,搭建好了OceanBase数据库环境、ob-configserver环境。

Rust环境搭建

  • 安装
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
  • 版本
rustcrustc 1.59.0-nightly (f1ce0e6a0 2022-01-05)
rustuprustup 1.25.1 (bb60b1e89 2022-07-12)
cargocargo 1.59.0-nightly (358e79fe5 2022-01-04)

obkv-table-client-rs工程(可选)

该步骤为可选,这一章节主要介绍如何编译obkv-table-client-rs工程。

  • 获取工程源码
git clone https://github.com/oceanbase/obkv-table-client-rs.git
  • 配置cargo国内镜像(可选),主要是为了加快下载速度,节省时间
vim ~/.cargo/config
# 写入以下内容
[source.crates-io] 
registry = "https://github.com/rust-lang/crates.io-index" 
replace-with = 'tuna' 
[source.ustc] 
registry = "git://mirrors.ustc.edu.cn/crates.io-index"
[source.tuna]
registry = "https://mirrors.tuna.tsinghua.edu.cn/git/crates.io-index.git"
  • 编译工程
cd obkv-table-client-rs
cargo build

Rust客户端测试

  • 新建工程
# 在obkv-table-client-rs同级目录下
cargo new obkv_cli

图片.png

  • 测试代码
// Copyright 2022 CeresDB Project Authors. Licensed under Apache-2.0.

extern crate obkv;

use std::{sync::Arc, thread, time};

use obkv::{serde_obkv::value::Value, Builder, ClientConfig, ObTableClient, RunningMode, Table};

// TODO: use test conf to control which environments to test.
const TEST_FULL_USER_NAME: &str = "frank@sys#obcluster";
const TEST_URL: &str = "http://172.18.108.43:8080/services?Action=ObRootServiceInfo&ObCluster=obcluster&database=test";
const TEST_PASSWORD: &str = "frank";
const TEST_SYS_USER_NAME: &str = "root@sys";
const TEST_SYS_PASSWORD: &str = "root";

fn build_client(mode: RunningMode) -> ObTableClient {
    let mut config = ClientConfig::default();
    config.min_idle_conns_per_server = 1;
    config.max_conns_per_server = 1;
    config.rpc_connect_timeout = std::time::Duration::from_secs(1);
    config.metadata_mysql_conn_pool_max_size = 1;
    config.metadata_mysql_conn_pool_min_size = 1;

    let builder = Builder::new()
        .full_user_name(TEST_FULL_USER_NAME)
        .param_url(TEST_URL)
        .running_mode(mode)
        .password(TEST_PASSWORD)
        .sys_user_name(TEST_SYS_USER_NAME)
        .sys_password(TEST_SYS_PASSWORD);

    let client = builder.build();

    assert!(client.is_ok());

    let client = client.unwrap();
    client.init().expect("Fail to create obkv client.");
    client
}

const TABLE_NAME: &str = "series_key_to_id_0";
// read and write the table:
// create table series_key_to_id_0 (
//  series_key VARBINARY(8096) NOT NULL,
//  series_id BIGINT NOT NULL,
//  PRIMARY KEY(series_key),
//  KEY index_id(series_id)
// );
fn concurrent_insert(client: Arc<ObTableClient>) {
    let mut thds = Vec::with_capacity(20);
    for i in 0..50 {
        let client = client.clone();
        let thd = thread::spawn(move || {
            for j in i * 100..(i * 100 + 50) {
                let series_key = format!("series_key_test_padding_padding_{}", j);
                let series_id = j * j;
                client
                    .insert(
                        TABLE_NAME,
                        vec![Value::from(series_key.clone())],
                        vec!["series_id".to_owned()],
                        vec![Value::from(series_id as i64)],
                    )
                    .expect(&format!("fail to insert row:{} {}", series_key, series_id));
            }
        });
        thds.push(thd);
    }

    for (i, thd) in thds.into_iter().enumerate() {
        thd.join().expect(&format!("thread#{} fail to join", i));
    }
}

fn main() {
    let client = build_client(RunningMode::Normal);
    client
        .truncate_table(TABLE_NAME)
        .expect("fail to truncate the table");
    let start = time::Instant::now();
    concurrent_insert(Arc::new(client));
    let elapsed = time::Instant::now() - start;
    println!("Benches::concurrent_insert cost time:{:?}", elapsed);
}

根据你自己的情况修改以下几个参数/变量:

const TEST_FULL_USER_NAME: &str = "frank@sys#obcluster";
const TEST_URL: &str = "http://172.18.108.43:8080/services?Action=ObRootServiceInfo&ObCluster=obcluster&database=test";
const TEST_PASSWORD: &str = "frank";
const TEST_SYS_USER_NAME: &str = "root@sys";
const TEST_SYS_PASSWORD: &str = "root";
  • Cargo.toml
[package]
name = "obkv_cli"
version = "0.1.0"
edition = "2022"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
obkv-table-client-rs = { path = "../obkv-table-client-rs" }
  • 编译
cd obkv_cli
cargo build
  • 运行
cargo run

Q&A

  • 运行报错
$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.21s
     Running `target/debug/obkv_cli`
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: MySqlError { ERROR 1193 (HY000): Unknown system variable 'socket' }', /home/frank/.cargo/registry/src/mirrors.tuna.tsinghua.edu.cn-df7c3c540f42cdbd/mysql-16.1.0/src/conn/mod.rs:1760:61
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

问题跟踪:https://github.com/oceanbase/obkv-table-client-rs/issues/6

总结

相对与obkv-table-client-java 客户端,obkv-table-client-rs 运行时会有一些问题,可能是版本相关的问题,应该可以很快解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/25801.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Visio画图更改连接线的弧形和调整跨线

目录前言准备参考问题解决问题一解决问题二前言 最近在使用Visio画图时&#xff0c;出现了一些问题&#xff0c;于是上网查了一下&#xff0c;将方法记录下来。 准备 Visio2021 参考 Visio中&#xff0c;如何修改连接线的跨线样式&#xff1f; 问题 (1) 使用连接线的时候…

【微信小程序】使用 Cryptojs 解密微信绑定手机号码

很抱歉断更了一段时间&#xff0c;因为最近在做一个项目比较忙&#xff0c;正好项目中小程序板块需要解密手机号码来提交给接口&#xff0c;小程序中虽然提供了获取手机号按钮点击事件&#xff1a;bindgetphonenumber&#xff0c;但是该事件的处理函数中只能获取到加密过的手机…

新力量,新希望|明道云伙伴大会2022秋圆满落幕

2022年10月28日至29日&#xff0c;明道云伙伴大会&#xff08;2022年秋&#xff09;在上海顺利举办。来自北京大兴国际机场、广汽本田、京东方、天津钢管、深圳龙华区卫健局、可口可乐、山东移动、浙江移动、上海电气数科、金科信息、艾默生电气等超过五百位参会者同台交流。行…

工业物联网的数据集成

随着网关技术的不断发展&#xff0c;创新、高效的软件解决方案及IT架构在工业物联网系统架构中将发挥着更为重要的作用。其中&#xff0c;工业物联网集成工业数据的一个关键问题在于如何利用软件、IT和创新算法来部署网络解决方案&#xff0c;从而使得生产效率更高。 &#xff…

Java中 this 和 super 的用法与区别

在Java的学习与开发者我们经常遇到this和super关键字&#xff0c;那么它们的用法和区别是什么呢&#xff1f; 一、this关键字 1.this是什么&#xff1f; this 是自身的一个对象&#xff0c;代表对象本身&#xff0c;可以理解为&#xff1a;指向对象本身的一个指针。 2.this…

javaScript之数组中reduce的详细介绍及使用

一、reduce功能接受及定义&#xff08;自我理解&#xff09; reduce方法为数组中的一个高阶函数&#xff0c;接受两个参数&#xff0c;第一个参数为回调函数&#xff0c;第二个为初始值。如果不给入初始值则会以数组第一项为初始值&#xff01;reduce会循环数组每一项&#xf…

数据库-深度剖析mysql索引原理(上)(三)

目录 一、什么是索引 二、索引由来 三、索引本质 四、索引数据结构 1、hsah 2、Btree 五、myISAM 和Innodb这两个数据库的索引是如何实现的呢&#xff1f; 1、首先看 MYSAM 1、以主键Id字段建立索引 2、以name字段来建立索引 2、在看Innodb数据库引擎的数据库 1、以…

Linux安装Jenkins详细步骤

安装jdk yum安装不需要配置环境变量 安装maven 下载maven 压缩包上传至服务器 解压缩 修改maven配置文件镜像地址 配置环境变量 安装Git 安装Jenkins war包下载 安装运行Jenkins 安装jdk 【Linux】Linux8 安装 JDK&#xff08;适用于各个版本&#xff09;_写bug的程…

JavaScript 数值 Number

目录1 数值 number1.1 数值储存1.2 数值表示1.2.1 数值分隔符1.3 特殊数值1.3.1 正零和负零1.3.2 NaN1.3.3 Infinity1.4 数值相关的全局方法1.5 Number 对象1.5.1 Number()1.5.2 Number 静态属性1.5.3 Number 静态方法1.5.4 Number 实例方法1.5.5 自定义方法1.6 Math 对象1.6.1…

ev-MOGA多目标进化算法(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

如何在 Windows 10 中安装 Azure Data Studio 1.39.1

安装 Azure Data Studio 1.39.1 官网下载 Azure Data Studio 1.39.1安装 Azure Data Studio 1.39.1Azure Data Studio 是一个跨平台数据库工具,适用于在 Windows、macOS 和 Linux 上使用本地和云数据平台的数据专业人员。 Azure Data Studio 提供了 IntelliSense、代码片段、源…

Java实现基于RSA的数字签名

加密与数字签名的区别 1、加密保证了数据接受方的数据安全性。加密的作用是防止泄密。 2、签名保证了数据发送方的数据安全性。签名的作用是防止篡改。 数字签名的应用 问题&#xff1a;在比特币中&#xff0c;怎么证明这个交易是你发布的&#xff1f; 这是就需要用到数字…

客户关系应该如何管理?

网络经过十多年的产业发展&#xff0c;中国的网络用户已经超过了8亿&#xff0c;网络也渐渐改变了盲目的商业价值追求&#xff0c;趋于稳定理性&#xff0c;已经开始向着多个路径全面性产业发展。网络上出现了各式各样的网络营销方式&#xff0c;如邮件网络营销、广告行业、浏览…

【python实战】朋友因股票亏了,很惨常愤恨不平,当天我就分析出原因:怎么做到的?(听说关注我的人会暴富)

导语 有温度 有深度 有广度 就等你来关注哦~ 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 对于大部分股票投资者来说&#xff0c;一年能拿住翻倍的股票就实属不易。一年10倍&#xff0c;甚至…

生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN

编号: 162943中文名称: 生物素标记肽Biotin-εAhx-GLKLRFEFSKIKGEFLKTPEVRFRDIKLKDN英文名: Biotin-εAhx-Gly-Leu-Lys-Leu-Arg-Phe-Glu-Phe-Ser-Ly英文同义词: Biotinyl-LC-hCAP-18 (134-170) (Scrambled), Biotinyl-LC-Cationic Antimicrobial Protein 18 (134-170) (human) …

hi mate, lets recall the bloody “JOIN“

补补数据库基础 上图中&#xff0c;表A的记录是123&#xff0c;表B的记录是ABC&#xff0c;颜色表示匹配关系。返回结果中&#xff0c;如果另一张表没有匹配的记录&#xff0c;则用null填充。 注意&#xff1a;多表连接查询会比直接使用自带的API查询表中的一个属性&#xff0…

基于STM32单片机的智能窗帘系统

本设计是基于STM32单片机的智能窗帘系统&#xff0c;主要实现以下功能&#xff1a; 1、 定时模式&#xff1a;早上&#xff08;7:00&#xff09;自动打开窗帘&#xff0c;晚上&#xff08;19&#xff1a;00&#xff09;自动关闭窗帘。 2、 手动模式&#xff1a;通过按键实现对…

处理 S4过账时的错误:“更正统一日记账分类账的定制设置”

目录 一、问题起因 二、问题分析​​​​​​​ 三、解决方法: 一、问题起因 在一个新配置的S4系统做FI凭证出现了如下报错&#xff1a; 点开后&#xff0c;报错显示如下&#xff1a; 更正统一日记账分类账的定制设置 消息号 FINS_ACDOC_CUST201 诊断 通用日记账的分类账…

SCADA系统在石油炼制行业的应用:如何实现石油炼制过程实时数据采集与监控?

一、应用背景 随着经济的逐步发展&#xff0c;企业开始关注基础技术和生产质量的提升。其中&#xff0c;作为基础工业项目的石油炼制企业需要对整体技术进行集中的整合&#xff0c;强化基础动态生产调度以及系统化的电子商务结构&#xff0c;才能提升整个行业的市场竞争力。 …

抢跑“补盲”风口,纯固态激光雷达上车面临哪些挑战?

未来两年&#xff0c;激光雷达市场高速发展的同时&#xff0c;来自市场的需求也逐渐清晰化。 高工智能汽车研究院预测数据显示&#xff0c;预计2025年前装标配激光雷达交付将有望达到200万颗/年的规模。其中&#xff0c;面向私人消费市场的车型&#xff0c;将主要以1颗前向、2…