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使用范例 的相关文章

  • 使用唯一索引删除重复项

    我在两个表字段 A B C D 之间插入 相信我已经在 A B C D 上创建了唯一索引以防止重复 然而我以某种方式简单地对这些做了一个正常的索引 因此插入了重复项 这是2000万条记录的表 如果我将现有索引从普通索引更改为唯一索引 或者只
  • Oracle存储过程使用数组作为表插入的参数

    我一直在寻找一个明显的例子 但没有运气 抱歉 如果已经回答了 我正在尝试做一些非常简单的事情 一个存储过程 它将获取输入并将它们插入到表中 我希望它获取多行数组并一次全部插入 我认为这很简单 但我还没有找到一个可以展示我的例子 在很多例子中
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • 授予用户在查询时使用表索引的什么?

    我想知道当用户从表中查询数据并且该用户已被授予以下权限时 oracle 是否使用索引 grant select on table to user 我想知道是否需要其他拨款才能使用索引 不 没有要求 或能力 授予对索引的访问权限 如果用户可以
  • 通过连接从两个表中删除?

    我有两个表如下 tbl1 tbl2 id article id title image whole news tags author older datetime 其中 tbl1 id gt tbl2 article id 如何从两个表中删
  • MySQL 服务器未启动

    当我做 mysql u root p并输入my password这就是我得到的 错误 2002 HY000 无法通过套接字 var run mysqld mysqld sock 连接到本地 MySQL 服务器 2 所以我输入 systemc
  • 如何将 MySQL 数据库更改为 UTC?

    我使用的是 Windows 7 对数据库方面的东西有点陌生 我尝试在 Google 上搜索如何将系统时区更改为 UTC 但文档有些高级 我不太确定如何更改此字段 在 my ini 文件的 mysqld 部分下 添加以下行 default t
  • Oracle 中的 SQL 调优 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何文章 链接可以让我找到 SQL 调优 Oracle 的示例 如果能用例子来解释那就太好了 我需
  • MySql 最后插入 ID,连接器 .net

    我正在使用 MySql Connector net 我需要获取最后一个查询生成的插入 id 现在 我假设返回值是MySqlHelper ExecuteNonQuery应该是最后一个插入id 但它只返回1 我正在使用的代码是 int inse
  • Mysql innoDB 不断崩溃[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的数据库 mysql 服务器不断崩溃 重新启动 我不知道该怎么办 我不断在 dbname org err 文件中收到以下内容 13120
  • 查询中列的顺序重要吗?

    当从 MySQL 表中选择列时 与表中的顺序相比 选择列的顺序是否会影响性能 不考虑可能覆盖列的索引 例如 您有一个包含行 uid name bday 的表 并且有以下查询 SELECT uid name bday FROM table M
  • MYSQL - 查找最近的前一天

    我可以以某种方式 不使用 PHP 找到一周中最近的前一天日期吗 Like 最近的上一个星期二的日期是哪一天 CURDATE INTERVAL WEEKDAY CURDATE wday IF WEEKDAY CURDATE gt wday 0
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • InnoDB 因读未提交而死锁! - Java - Glassfish - EJB3(JPA/Hibernate)

    几天来 我在使用 Glassfish EJB3 和 Mysql InnoDB 的 Java 应用程序上遇到了死锁问题 配置 Mysql InnoDB Ver 14 12 Distrib 5 0 51a 适用于 debian linux gn
  • 如何在Sequelize中设置查询超时?

    我想看看如何在 Sequelize 中设置查询的超时时间 我查看了 Sequelize 文档以获取一些信息 但我找不到我要找的东西 我发现的最接近的是 pools acquire 选项 但我不想设置传入连接的超时 而是设置正在进行的查询的超
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • Pivotal Cloud Foundry - 连接到外部 Oracle 数据库

    我正在创建一个 Spring boot 应用程序 该应用程序连接到一个不由 PCF 管理 或驻留在外部 的 Oracle 数据库 在我的本地开发环境中 我在 application properties 文件中配置了数据库连接详细信息 有人
  • Mysql 创建定义器

    我创建了一个在 CentOS Web 服务器上运行的 Intranet Web 应用程序 该应用程序使用另一个本地服务器 始终是 CentOS 作为 MySQL 数据库 在数据库内部我创建了例程 这些例程总是这样开始 CREATE DEFI

随机推荐

  • 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