OceanBase使用范例

2023-11-19

http://www.mysqlops.com/2011/08/31/oceanbase-use.html

 

OceanBase的使用类似于关系型数据库,需要预先创建schema,关于schema的格式,请参见schema说明

假如我们有以下schema:

[app_name]
name=student
max_table_id=1002

[student]
table_id=1001
max_column_id=22
table_type=1
#rowkey=class_id(8bytes) + student id(8bytes)
rowkey_is_fixed_length=1
column_info=1,2,gmt_created,create_time
column_info=1,3,gmt_modified,modify_time
column_info=1,16,student_name,varchar,128
column_info=1,17,student_sex,int
column_info=1,18,student_age,int
column_info=1,19,student_addr,varchar,128
column_info=1,20,cplusplus,int
column_info=1,21,oceanbase,int
column_info=1,22,english,int

join=rowkey[7,15]%score:cplusplus$cplusplus,oceanbase$oceanbase,english$english

rowkey_max_length=16
rowkey_split=8

[score]
table_id=1002
table_type=1
max_column_id=18
#rowkey=student id(8bytes)
rowkey_is_fixed_length=1
column_info=1,2,gm_create,create_time
column_info=1,3,gm_modified,modify_time
column_info=1,16,cplusplus,int
column_info=1,17,oceanbase,int
column_info=1,18,english,int
rowkey_max_length=8
rowkey_split=0

这里一共有两张表,student和score,student表冗余了score表的一些字段,有join关系。

OceanBase目前只支持java client,源代码在svn中可以下载。客户端需要知道集群rootserver的地址和端口。

0. 关于Rowkey

在OceanBase中数据是按行存储的,每行由rowkey唯一标识,rowkey是binary stream形式,OceanBase不会对其进行解释。 rowkey可以由多段组成,应用对其进行解释,比如上两张表的rowkey为:

//student的rowkey由二个部份组成,第一部份为班级id,第三部份为学生id。
//该rowkey为定长16字节
//在查询的时候可以只给出班级id,表示查找该班级下的所有学生。
class StudentRowkey extends Rowkey {
	public StudentRowkey(long classid,long student_id) {
	    byteBuffer.putLong(classid);
	    byteBuffer.putLong(student_id);
	}

    final ByteBuffer byteBuffer = ByteBuffer.allocate(16);

    public byte[] getBytes() {
    	return byteBuffer.array();
    }
};

//score的rowkey为student id,定长8字节
class ScoreRowkey extends Rowkey {
	public ScoreRowkey(byte item_type,long item_id) {
	    byteBuffer.put(item_type);
	    byteBuffer.putLong(item_id);
	}

    final ByteBuffer byteBuffer = ByteBuffer.allocate(8);

    public byte[] getBytes() {
    	return byteBuffer.array();
    }
}

1. 初始化:

	private ClientImpl client;
	client = new ClientImpl();
	client.setIp(ip); //the ip of the rootserver
	client.setPort(port); //the port of the rootserver
	client.setTimeout(2000); //超时时间,单位毫秒
	client.init();

2. 写入

在目前的版本中,OB的update和insert语义是相同的。更新的时候需要提供表名、rowkey、以及各列的值。

	final private static String STUDENT_TABLE_NAME="student";
	final private static String STUDENT_NAME="student_name";
	final private static String STUDENT_AGE="student_age";
	final private static String STUDENT_SEX="student_sex";
	final private static String STUDENT_ADDR="student_addr";
	final private static String SCORE_CPLUSPLUS="cplusplus";
	final private static String SCORE_OCEANBASE="oceanbase";
	final private static String SCORE_ENGLISH="english";

	/**
	 * for OB semantics , update & insert is identical
	 * DB semantics is not support yet.
	 */
	void UpdateDemo() {
		List<ObMutatorBase> mutatorList = new ArrayList<ObMutatorBase>();
                for (Long i = 0L; i < 100; i++) {
                      UpdateMutator mutator = new UpdateMutator(STUDENT_TABLE_NAME, new StudentRowkey(0, i));
                      mutator.addColumn(USER_NICK, new  Value() {{ setString("YOUR_VALUE"); }},false);
                      mutator.addColumn(STUDENT_SEX, new Value() {{setNumber(1L);}},false);
                      mutator.addColumn(STUDENT_AGE, new Value() {{setNumber(10L);}},false);
                      mutator.addColumn(STUDENT_ADDR, new Value() {{setString("ADDR");}},false);
                      mutatorList.add(mutator);
		      //分数只能在分数表中更新
                }

                Result<Boolean> ret = client.update(mutatorList);
                if (ret == null || !ret.getResult()){
        	     System.err.println("update failed");
                }
	}
        void InsertDemo() {
            for (Long i = 0L; i < 100; i++) {
                InsertMutator mutator = new InsertMutator(STUDENT_TABLE_NAME, new StudentRowkey(i, (byte)0, i));
                mutator.addColumn(USER_NICK, new  Value() {{ setString("YOUR_VALUE"); }},false);
                mutator.addColumn(STUDENT_SEX, new Value() {{setNumber(1L);}},false);
                mutator.addColumn(STUDENT_AGE, new Value() {{setNumber(10L);}},false);
                mutator.addColumn(STUDENT_ADDR, new Value() {{setString("ADDR");}},false);
		//类似update,insert也可以做批量插入
                Result<Boolean> ret = client.insert(mutator);
                if (ret == null || !ret.getResult()){
            	    System.err.println("update failed " + ret.getCode());
                }
            }
	}

3. 查询

查询分为get和scan,get是指定rowkey进行查询,而scan是范围查询。

	void queryDemo() {
		QueryInfo query_info = new QueryInfo();
		query_info.setStartKey(new StudentRowkey(0L, 0L));
		query_info.setEndKey(new StudentRowkey(0L,100L));
		query_info.addColumn(STUDENT_NAME);
		query_info.addColumn(STUDENT_SEX);
		Result<List<RowData>> result = client.query(STUDENT_TABLE_NAME, query_info);
		System.out.println("get " + result.getResult().size() + "items");
	}
	void getDemo() {
		Set<String> columns = new HashSet<String>();
		columns.add(STUDENT_NAME);
		columns.add(STUDENT_SEX);
		Result<RowData> ret = client.get(STUDENT_TABLE_NAME, new StudentRowkey(
				0L,1L), columns);
		if (ret == null) {
			System.err.println("get failed ");
		} else {
			System.err.println("get " + ret.getResult().get(STUDENT_NAME));
		}
	}

4. orderby & where

	void queryDemoWhere() {
		QueryInfo query_info = new QueryInfo();
		query_info.setStartKey(new StudentRowkey(0L,0L));
		query_info.setEndKey(new StudentRowkey(0L,100L));
		query_info.addColumn(STUDENT_NAME);
		query_info.addColumn(STUDENT_SEX);

		ObSimpleFilter filter = new ObSimpleFilter();
		filter.addCondition(new ObSimpleCond(STUDENT_SEX,ObSimpleCond.ObLogicOperator.EQ,new Value() {{setNumber(0L);}}));
		query_info.setFilter(filter);
		Result<List<RowData>> result = client.query(STUDENT_TABLE_NAME, query_info);
		System.out.println("get" + result.getResult().size() + "items");
	}

	void queryDemoOrderby() {
		QueryInfo query_info = new QueryInfo();
		query_info.setStartKey(new StudentRowkey(0L, 0L));
		query_info.setEndKey(new StudentRowkey(0L, 100L));
		query_info.addColumn(STUDENT_NAME);
		query_info.addColumn(STUDENT_SEX);

		query_info.addOrderBy(STUDENT_SEX, true); //order: true -ASC false - DESC
		Result<List<RowData>> result = client.query(STUDENT_TABLE_NAME, query_info);
		System.out.println("get" + result.getResult().size() + "items");
	}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

OceanBase使用范例 的相关文章

  • 当Where子句中的术语不在数据库中时,如何从MySQL数据库返回0?

    如果 WHERE 子句中的邻域不存在 如何让 mysql 数据库返回 0 因此 在下面的示例中 旧城区不在数据库中 我希望数据库返回 0 个事件而不是空结果 SELECT incidents neighborhoods FROM myTab
  • 如何对表的选定列进行 mysql 转储

    我有一个要求 我必须仅对表的一列进行 mysql 转储 由于该表有太多列 我不想转储整个表 我必须将表的转储从一台服务器转移到另一台服务器 知道我该怎么做吗 如果您想获取包含架构的 mysql 转储 可以按照以下步骤完成 创建临时表 cre
  • 使用 mysql 变量保存用于 where in 子句的逗号分隔值

    我必须运行这样的查询 查询 1 select something from sometable where someId in 1 2 3 我想为 ID 部分保留一个变量 如下所示 查询 2 set myIds 1 2 3 select s
  • mysqli_query() 需要至少 2 个参数,其中 1 个参数在? [复制]

    这个问题在这里已经有答案了 每次运行这个 php ini 时 我都会遇到同样的 3 个错误 我不知道我做错了什么 有人可以帮忙吗 以下是错误 2014 年 5 月 5 日 19 20 50 美洲 芝加哥 PHP 警告 mysqli quer
  • 未捕获的类型错误:$.ajax 不是函数

    我正在制作一个带有排行榜表的小型游戏项目 我正在尝试使用 jQuery ajax 和 PHP 从 mysql 数据库获取排行榜以显示 但它给了我一条错误消息 我的语法看起来不错 所以我不确定问题是什么 leader btn click fu
  • Mysql 选择 csv 字符串中的 where 字段

    我想从一个表中进行选择 其中的字段位于传递给存储过程的给定 csv 字符串中 最快的方法是什么 我应该将这些值插入临时表并加入其中吗 或者有没有办法用一个语句来做到这一点 Thanks 做了一些搜索并找到了一个很好的答案 使用MySql的字
  • 自动生成序列号

    我编写了下面的计数代码 目的是让它为我的数据生成自动序列号 以代替删除行后的 MySQL 序列号 但是当我运行它时 我发现 MySQL 表中没有任何条目 后来我将代码更改为 Dreamweaver 插入记录 并观察到 SN 序列号 字段不需
  • PHP/HTML 添加删除按钮

    我有下面的代码来从数据库中检索行 其中用户名列与基本目录名称匹配 username basename dirname FILE username mysql real escape string username result mysql
  • 从同一mysql服务器的不同数据库复制表

    我有一台带有 2 个数据库的服务器 我想将多个表从一个数据库复制到另一个数据库 目的是我们使用项目中使用的相同用户表 正如在另一个表中使用 InnoDB 和用户表的外键一样 我选择了一种复制方式 为此我对 my cnf 进行了更改 mast
  • Dapper MySQL 返回值

    我在 ASP net Identity 项目中使用 dapper 和 MySql 时遇到问题 我想将用户插入到表 users 中 并希望从这次插入中返回自动生成的 id 但我收到语法错误 我不知道为什么 这是我的方法插入代码 public
  • mysql:拒绝行更新

    我有一个包含 3 个字段的表 其中一个是 状态 status 是一个 ENUM 可能包含 a b 或 c 内容 我需要找到一种方法来拒绝对 status b 的所有行进行任何更新 甚至不允许根用户更新这些行 所以这就像让这一行成为 最终 如
  • mysql 中 int(11) 列的大小是多少(以字节为单位)?

    柱子的尺寸是多少int 11 在mysql中以字节为单位 该列中可以存储的最大值 An INT无论指定什么长度 都将始终为 4 个字节 TINYINT 1 字节 8 位 SMALLINT 2 字节 16 位 MEDIUMINT 3 字节 2
  • 将一段文本保存到mysql

    我正在使用 php 和 mysql 做一个项目 我对此很陌生 现在我必须将一段文本存储到我的数据库中 在表中 对于列 I tried varchar 5000 创建表时但它不允许我 所以请给我一个解决方案 你的 mysql 字段类型应该 T
  • 在oracle sql中创建日期差异的自定义函数,排除周末和节假日

    我需要计算两个日期之间的天数decimal 不包括周末和节假日 by 使用自定义函数在 Oracle SQL 中 网站上也有类似的问题 然而 正如我所看到的 它们都没有要求使用自定义函数将输出作为十进制 我需要小数的原因是为了之后能够使用
  • 拥有两张单独的用户表还是一张更好?

    我的网络应用程序将拥有两种 100 不同的用户 领域 功能和网站目的 一类用户的目的是发布博客 另一类用户的目的是阅读博客并 关注 发布者 他们唯一的共同点是需要 ID 电子邮件 密码和其他一些元数据 例如加入日期等 我应该尝试将它们从同一
  • 如何连接flutter到localhost mysql数据库

    我想将本地主机 mysql 数据库连接到 flutter 但我没有这样做 我尝试了 mysql1 与这些连接 ConnectionSettings host 10 0 2 2 port 3306 user root password roo
  • 具有 TINYTEXT 列的 CREATE TABLE 语句中出现语法错误 1064?

    这是我到目前为止的 MySQL 代码 CREATE DATABASE bankbase USE bankbase CREATE TABLE clienttable ClientID SMALLINT 15 NOT NULL DEFAULT
  • 无效号码错误!似乎无法绕过它

    Oracle 10g 数据库 我有一张桌子叫s contact 这个表有一个字段叫做person uid This person uid字段是 varchar2 但包含某些行的有效数字和其他行的无效数字 例如 一行可能有一个person u
  • 如何选择集合的第一个元素作为查询的列

    表 t 有两列 a 和 b a是整数 b是集合 我想为每一行选择 a 和集合 b 的第一个值 我试过了 但没用 WITH s a b AS SELECT 1 ff FROM DUAL UNION ALL SELECT 1 ee FROM D
  • mysql REPLACE 具有多个主键的查询

    因此 如果存在与插入数据具有相同主键的列 则 MYSQL 的 REPLACE 命令 不要与字符串替换函数混淆 将替换一行 但是如果我有两个主键并且我想使用这两个主键来指定要替换的行而不仅仅是其中一个 我如何指定 mysql 使用两个键而不是

随机推荐

  • golang-bufio 缓冲扫描

    前面两篇博客 介绍了 bufio 包中的缓冲读和写 bufio go 下面再来介绍一下缓冲扫描 scan go 这个扫描的是用来对缓存读的更高级封装 提供了一些更易用的方法 缓冲扫描 Scanner 提供了一个方便的接口来读取数据 例如使用
  • flask-会话机制

    使用flask bootstrap 步骤 1 pip install flask bootstrap 2 进行配置 from flask bootstrap import Bootstrap bootstrap Bootstrap 在 in
  • kafka 监控工具--CMAK

    CMAK previously known as Kafka Manager is a tool for managing Apache Kafka clusters See below for details about the name
  • 二分法总结(超级详细)附带图解

    文章目录 1 二分法 2 时间复杂度 3 二分法的套路 3 1 整数的二分 3 2 实数的划分 四 相关习题 4 1 数的范围 4 2 数的三次方根 1 二分法 二分查找是一个时间效率极高的算法 尤其是面对大量的数据时 其查找效率是极高 时
  • python读取npy文件时,太大不能完全显示,其解决方法

    python读取npy文件时 太大不能完全显示 其解决方法 当用python读取npy文件时 会遇到npy文件太大 用print函数打印时不能完全显示 如以下情况 其解决办法是 添加一行代码 np set printoptions thre
  • 2023汽车行业数字化转型报告

    目前 汽车行业正经历百年未有之大变局 在新一轮科技革命以及减碳 能源形势变革智能化变革推动下 汽车产业正由功能时代向智能时代演进 由 以车为中心 向 以用户为中心 转变 汽车的产品属性 产业价值链和生态结构都面临被颠覆 新的汽车市场格局正在
  • Python爬虫从入门到精通:(33)scrapy中间件_Python涛哥

    中间件 作用 批量拦截请求和响应 爬虫中间件 下载中间件 推荐 拦截请求 篡改请求url 伪装请求头信息 UA Cookie 设置代理 重点 拦截响应 篡改响应数据 详解 我们创建个工程middlePro 爬取百度和搜狗 import sc
  • goto编程练习

    for 的初始化要放到JUMP上边 不然i会一直为1 for 的i 也不能放到括号里边 不然i永远为0 1 include
  • 200smart第二课基本编程

    一 程序块 主程序main和子程序 主程序是执行程序的入口 没有主程序就不知道程序从哪里开始 子程序是一个大型程序中的某个代码 一般是完成某个算法 二 符号表 给变量定义 当我们在编程的时候 需要定义一些符号名称 如下图 程序运行 注释使程
  • MFC重载鼠标停留WM_MOUSEHOVER和离开WM_MOUSELEAVE消息

    1 重载OnMouseMove 消息 在消息的实现中添加代码 void CMainWindow OnMouseMove UINT nFlags CPoint point TRACKMOUSEEVENT tme tme cbSize size
  • 爬虫与反爬虫技术简介

    互联网的大数据时代的来临 网络爬虫也成了互联网中一个重要行业 它是一种自动获取网页数据信息的爬虫程序 是网站搜索引擎的重要组成部分 通过爬虫 可以获取自己想要的相关数据信息 让爬虫协助自己的工作 进而降低成本 提高业务成功率和提高业务效率
  • @JSONField 解决json字符串转对象,对象属性名与json中key不一致,如何接收数据问题

    背景 我有个对象 过来个json 想用这个对象接收json中的值 对象中属性名与json中key值不一致 实现 这个时候 JSONField注解就派上用场了 不能直接放在属性上 要放在set方法上 模拟 1 搞个对象 属性名分别为name
  • 【靶场】upload-labs Pass-02

    考纲 本pass在服务端对数据包的MIME进行检查 在右上角点击 查看提示 中看到 一 上一关 靶场 upload labs Pass 01 二 大马 介绍两款 php 大马 因为 一句话木马看不上 如果师傅有其他好用的 大马 还望师傅在评
  • QT添加qss文件和资源文件

    先右键项目 选择 Add New 选择一个模板 选择 Qt 模板 再选择 Qt Resource Files 点击 Choose 填上资源文件的名称 默认添加项目路径下 后面的步骤默认即可 点击完成 新建完成了资源文件后 默认会进入 res
  • 运放稳定性连载21:电容性负载的稳定性——具有双通道反馈的RISO(2)

    现在 我们必须测量如图10 6所示的Zo 小信号AC开环输出阻抗 该Tina SPICE测试电路将测试空载OPA177的Zo R2和R1以及LT为低通滤波器函数提供了一条AC通道 这样 使得我们能将DC短路和AC开路一起并入反馈电路 DC工
  • ssh报错no key alg(关于低版本连接高版本ssh)

    高版本 8 4 低版本 4 3 按照网上的方法试过 通过ssh keygen命令重新生成ssh主机秘钥 可以不用重启sshd服务 ssh keygen t rsa f etc ssh ssh host rsa key ssh keygen
  • NoReverseMatch: Reverse for ‘data‘ not found . ‘data‘ is not a valid view function or pattern

    Django gt python manage py runserver时报错 NoReverseMatch Reverse for data not found data is not a valid view func tion or
  • 制作一辆“自动驾驶”平衡自行车需要用到哪些知识

    目录 先看下小车效果 小车电路设计 相关软件工具 keil C语言设计编码调试工具 主要 mcuisp 代码烧录工具 一般使用一种烧录工具就可以 STM32 STlink stlink烧录工具 STM32 Cube pro 烧录工具 ope
  • C++中的虚函数(表)实现机制以及用C语言对其进行的模拟实现

    本文是转载的 正版是https blog twofei com 496 欢迎去看正版 C 中的虚函数 表 实现机制以及用C语言对其进行的模拟实现 前言 大家都应该知道C 的精髓是虚函数吧 虚函数带来的好处就是 可以定义一个基类的指针 其指向
  • OceanBase使用范例

    http www mysqlops com 2011 08 31 oceanbase use html OceanBase的使用类似于关系型数据库 需要预先创建schema 关于schema的格式 请参见schema说明 假如我们有以下sc