百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 博客教程 > 正文

[信创]SpringBoot3 JDK17 整合 MyBatis + Oceanbase(二)

connygpt 2024-11-21 13:24 18 浏览

前面介绍了 OceanBase 按需选择的各种部署方案,本文接着把后半部完成。


1. 监控与管理工具

先来看一下 oceanbase 自带的服务和性能监控工具 grafana prometheus前一篇我们已经完成了它们的安装,并已启动。


1.1. Grafana

前文提到 Grafana 是一款开源的数据可视化工具,可以将数据源中的各种指标数据进行可视化展示,以便更直观地了解系统运行状态和性能指标。这里也简单的跑起来看看。

不过在这之前,先做个实验,试试把虚拟机的内存从 10G 调低到 8G 是否可行。修改之后重启服务,结果报错:内存不足,没辙只好重新改回 10G

回到 grafana 的使用吧,在服务启动过程中可以看到 grafana 服务的地址和初始账号信息:

不过要在浏览器中打开,还需要开放端口:

[root@localhost ~]# firewall-cmd --permanent --add-port=3000/tcp
success
[root@localhost ~]# firewall-cmd --reload
success

这时就可以在浏览器中输入 URL,按提示输入用户名密码,就可以看到服务器的性能指标了:

看起来还是不错的[给力]


1.2. Prometheus

再来看 Prometheus,它是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型以及快捷数据采集、存储和查询接口。同样在启动过程中会输出该服务的相关信息:

类似的,也要先开放端口:

[root@localhost ~]# firewall-cmd --permanent --add-port=9090/tcp
success
[root@localhost ~]# firewall-cmd --reload
success

然后在浏览器输入 URL 打开。Alerts 页面用来查看异常情况:

Status 下面的 Rules 页面,可以看到超出规则指标的警告:


2. 数据库规划

  • 单机最小化集群:demo (前文已完成)

  • 系统租户:sys (随集群自动创建)

    • root 用户密码:123456789(密码待修改)

    • 连接命令:obclient -h127.0.0.1 -P2881 -uroot@sys -p -Doceanbase -A

  • 业务租户:obmysql(待创建)

    • root 用户密码:123456(待创建)

    • 连接命令:obclient -h127.0.0.1 -uroot@obmysql -P2881 -p123456 -A

  • 业务数据库:mydb(待创建)

    • user 表(待创建)


2.1. 修改系统租户的密码

系统租户 sys root 用户的默认密码为空,这里把它修改为 123456789。

# admin 账号登录 linux,执行如下命令
[admin@localhost ~] obd cluster edit-config demo

 # 在 oceanbase-ce/global的最后增加一行:
 # root_password: 123456789,如下图
# 使修改生效
[admin@localhost ~] obd cluster reload demo

分别采用无密码和新密码来连接,验证密码设置成功:


2.2. 创建租户 obmysql(数据库实例)

OceanBase 中,数据是按照租户来组织的,所以首先应创建一个租户实例(数据库实例)。创建之前,应该先了解一下租户类型

  • 系统租户:集群默认创建的租户,与集群生命期一致,负责管理集群和所有租户的生命周期。系统租户数据是集群私有的,不支持物理备份恢复。

  • 用户租户:用户租户是由用户创建的租户,对外提供完整的数据库功能,支持 MySQL Oracle 两种兼容模式。

  • Meta 租户Meta 租户是 OceanBase 数据库内部自管理的租户,每创建一个用户租户会创建一个对应的 Meta 租户,其生命周期与用户租户保持一致。Meta 租户用于存储和管理用户租户的租户私有数据,这部分数据不需要跨库物理同步以及物理备份恢复。Meta 租户不可登录,普通用户只能通过系统租户的视图查询 Meta 租户下的数据。

部署 OceanBase 之后,建议创建用户租户进行业务操作。sys 租户仅做集群管理使用,不适合在业务场景中使用。租户创建后,租户类型无法修改,因此创建租户前请规划好租户类型。本文选择 MySQL 租户类型


2.2.1. 创建方法一

使用 obd 工具,用法如下:

# 语法:obd cluster tenant create <deploy name> [-n <tenant name>] [flags]
# -n tenant_name
# --max-iops Max IOPS unit nuber
# --unit-num pool unit nuber
obd cluster tenant create demo -n obmysql --max-cpu=2 --memory-size=2G --log-disk-size=3G --max-iops=10000 --iops-weight=2 --unit-num=1 --charset=utf8mb4

租户创建成功后,默认管理员用户(MySQL 模式为 rootOracle 模式为 sys)的密码为空。

[admin@localhost ~]$ obclient -h127.0.0.1 -uroot@obmysql -P2881 -p -Doceanbase -A
Enter password: 
Welcome to the OceanBase.  Commands end with ; or \g.
Your OceanBase connection id is 3221494035
Server version: OceanBase_CE 4.2.1.2 (r102000042023120514-ccdde7d34de421336c5362483d64bf2b73348bd4) (Built Dec  5 2023 14:34:01)

Copyright (c) 2000, 2018, OceanBase and/or its affiliates. All rights reserved.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

查看租户信息,如上使用 obclient 工具连接新创建的租户后,使用下面 SQL 语句查询:

obclient [oceanbase]> select * from __all_unit_config;
obclient [oceanbase]> select * from dba_ob_tenants;
obclient [oceanbase]> show tenant;

修改允许任意主机登录,默认只能从本机登录。

# 使用租户 obmysql 的 root 用户登录
[admin@localhost ~]$ obclient -h127.0.0.1 -uroot@obmysql -P2881 -p -Doceanbase -A
# 修改允许任意主机登录
obclient [oceanbase]> alter tenant obmysql set variables ob_tcp_invited_nodes='%';

看到这里是不是有种强烈的熟悉感,没错和 MySQL 一样的操作。后面就可以把 obmysql 当作 MySQL Server 来看待。

修改租户的 root 用户密码:

# 查看当前租户
obclient [oceanbase]> show tenant;
# 修改当前租户的 root 用户的密码
obclient [oceanbase]> alter user root identified by '123456';


2.2.2. 创建方法二

使用系统租户 sys,连接到 OceanBase 服务器,执行 SQL 命令来创建一个用户租户。

  • 步骤一:创建资源规格

# 使用 sys 租户的 root 用户登录
[admin@localhost ~]$ obclient -h127.0.0.1 -P2881 -uroot@sys -p123456789 -A

# 选择 oceanbase 数据库
obclient [(none)]> use oceanbase;

# 通过 DBA_OB_UNIT_CONFIGS 视图,获取已有的资源规格信息
obclient [oceanbase]> select * from dba_ob_unit_configs;

# 创建资源规格
CREATE RESOURCE UNIT dbmysql2_unit_config MEMORY_SIZE = '2G', MAX_CPU = 1, MIN_CPU = 1, LOG_DISK_SIZE = '2G', MAX_IOPS = 10000, MIN_IOPS = 10000, IOPS_WEIGHT=1;

# 查看资源规格是否创建成功
obclient [oceanbase]> SELECT * FROM DBA_OB_UNIT_CONFIGS WHERE NAME = 'dbmysql2_unit_config';
  • 步骤二:创建资源池

# CREATE RESOURCE POOL dbmysql2_pool UNIT='dbmysql2_unit_config', UNIT_NUM=1, ZONE_LIST=('zone1','zone2'); 
CREATE RESOURCE POOL dbmysql2_pool UNIT='dbmysql2_unit_config', UNIT_NUM=1; 

# 查询 DBA_OB_RESOURCE_POOLS 视图,确认资源池创建成功
obclient [oceanbase]> SELECT * FROM DBA_OB_RESOURCE_POOLS WHERE NAME = 'dbmysql2_pool';
  • 步骤三:创建租户

# 创建租户
# CREATE TENANT IF NOT EXISTS dbmysql2 PRIMARY_ZONE='zone1', RESOURCE_POOL_LIST=('dbmysql2_pool'), charset='utf8mb4' set OB_TCP_INVITED_NODES='%';

CREATE TENANT IF NOT EXISTS dbmysql2 PRIMARY_ZONE='RANDOM', comment 'mysql tenant instance', RESOURCE_POOL_LIST=('dbmysql2_pool'), charset='utf8mb4' set OB_TCP_INVITED_NODES='%';


2.3. 连接租户 obmysql

使用新创建的租户的用户名和密码连接到 OceanBase 服务器。支持通过客户端、驱动或 ORM 框架连接到 OceanBase 数据库的租户。

# 使用租户 obmysql 的 root 用户登录
[admin@localhost ~]$ obclient -h127.0.0.1 -uroot@obmysql -P2881 -p -Doceanbase -A
[admin@localhost ~]$ obclient -h127.0.0.1 -uroot@obmysql -P2883 -p123456 -Doceanbase -A


2.4. 创建业务数据库 mydb 和 user 表

连接到相应的租户 obmysql(可以把它看作是 MySQL Server)后,就可以在其上创建自己的业务数据库了,可以创建很多个哦,和在 MySQL Server 上创建多个 DB 是一样一样的。

obclient> CREATE DATABASE mydb DEFAULT CHARACTER SET utf8mb4 READ WRITE;
obclient> SHOW DATABASES;
obclient> USE mydb;
obclient> CREATE TABLE user (seq INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20), gender VARCHAR(20), birthday DATE);

查看是否创建成功:

插入两条数据:

# 插入两行数据
obclient [mydb]> insert user(name, gender, birthday) values("张三", "男", "2000-01-01"),("李四", "女", "2008-02-02");
Query OK, 2 rows affected (0.038 sec)
Records: 2  Duplicates: 0  Warnings: 0
# 查看数据
obclient [mydb1]> select * from user;


3. SpringBoot3 + MyBatis + OceanBase 实现增删改查

这里不再从头开始,而是基于前面 SpringBoot3 + MyBatis + 达梦8 文章中的实现直接修改依赖,连接字符串,并微调 Mapper 接口即可实现。


3.1. 基于 dm8 的代码,修改驱动依赖,POM.xml

<!-- 把原来达梦的驱动换成 mysql 的驱动 -->
<!-- <dependency>-->
<!-- <groupId>com.dameng</groupId>-->
<!--     <artifactId>DmJdbcDriver18</artifactId>-->
<!--     <version>8.1.3.62</version>-->
<!-- </dependency>-->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>


3.2. 基于 dm8 的代码实现,修改 application.yml 中的数据源配置

spring:
  datasource:
    #driver-class-name: dm.jdbc.driver.DmDriver
    driver-class-name: com.mysql.cj.jdbc.Driver
    #url: jdbc:dm://192.168.1.107:5236?schema=DEMO&genKeyNameCase=2&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://192.168.1.105:2881/mydb?useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&serverTimezone=Asia/Shanghai
    username: root@obmysql
    password: '123456'
mybatis:
  configuration:
    mapUnderscoreToCamelCase: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl


3.3. 修改 DAO(MyBtis Mapper 接口),去掉为了达梦大小写而加的引号

@Repository
public interface UserDao {
    @Select("select * from user")
    List<UserEntity> list();
    ...
}
@Repository
public interface UserDao {
  ... ...
  @Update({
    "<script>" +
        "update user " +
        "<set>" +
            "<if test='name != null'>name=#{name},</if> " +
            "<if test='birthday != null'>birthday=#{birthday},</if> " +
            "<if test='gender != null'>gender=#{gender},</if> " +
        "</set> " +
        "where seq=#{seq}" +
    "</script>"
  })
  int update(UserEntity product);
  ... ...
}
@Repository
public interface UserDao {
  ...
  @Delete("delete from user where seq= #{seq}")
  int delete(Long seq);
  ...
}
@Repository
public interface UserDao {
  ...
  @Insert(
 "insert into user (name, birthday, gender) values (#{name}, #{birthday, jdbcType=DATE}, #{gender})"
  )
  @Options(useGeneratedKeys = true, keyProperty = "seq", keyColumn = "seq")
  int insert(UserEntity product);
  ...
}

全文完成,感谢阅读[比心]

相关推荐

3分钟让你的项目支持AI问答模块,完全开源!

hello,大家好,我是徐小夕。之前和大家分享了很多可视化,零代码和前端工程化的最佳实践,今天继续分享一下最近开源的Next-Admin的最新更新。最近对这个项目做了一些优化,并集成了大家比较关注...

干货|程序员的副业挂,12个平台分享

1、D2adminD2Admin是一个完全开源免费的企业中后台产品前端集成方案,使用最新的前端技术栈,小于60kb的本地首屏js加载,已经做好大部分项目前期准备工作,并且带有大量示例代码,助...

Github标星超200K,这10个可视化面板你知道几个

在Github上有很多开源免费的后台控制面板可以选择,但是哪些才是最好、最受欢迎的可视化控制面板呢?今天就和大家推荐Github上10个好看又流行的可视化面板:1.AdminLTEAdminLTE是...

开箱即用的炫酷中后台前端开源框架第二篇

#头条创作挑战赛#1、SoybeanAdmin(1)介绍:SoybeanAdmin是一个基于Vue3、Vite3、TypeScript、NaiveUI、Pinia和UnoCSS的清新优...

搭建React+AntDeign的开发环境和框架

搭建React+AntDeign的开发环境和框架随着前端技术的不断发展,React和AntDesign已经成为越来越多Web应用程序的首选开发框架。React是一个用于构建用户界面的JavaScrip...

基于.NET 5实现的开源通用权限管理平台

??大家好,我是为广大程序员兄弟操碎了心的小编,每天推荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节省开发效率,实现不加班不熬夜不掉头发,是我的目标!??今天小编推荐一款基于.NE...

StreamPark - 大数据流计算引擎

使用Docker完成StreamPark的部署??1.基于h2和docker-compose进行StreamPark部署wgethttps://raw.githubusercontent.com/a...

教你使用UmiJS框架开发React

1、什么是Umi.js?umi,中文可发音为乌米,是一个可插拔的企业级react应用框架。你可以将它简单地理解为一个专注性能的类next.js前端框架,并通过约定、自动生成和解析代码等方式来辅助...

简单在线流程图工具在用例设计中的运用

敏捷模式下,测试团队的用例逐渐简化以适应快速的发版节奏,大家很早就开始运用思维导图工具比如xmind来编写测试方法、测试点。如今不少已经不少利用开源的思维导图组件(如百度脑图...)来构建测试测试...

【开源分享】神奇的大数据实时平台框架,让Flink&amp;Spark开发更简单

这是一个神奇的框架,让Flink|Spark开发更简单,一站式大数据实时平台!他就是StreamX!什么是StreamX大数据技术如今发展的如火如荼,已经呈现百花齐放欣欣向荣的景象,实时处理流域...

聊聊规则引擎的调研及实现全过程

摘要本期主要以规则引擎业务实现为例,陈述在陌生业务前如何进行业务深入、调研、技术选型、设计及实现全过程分析,如果你对规则引擎不感冒、也可以从中了解一些抽象实现过程。诉求从硬件采集到的数据提供的形式多种...

【开源推荐】Diboot 2.0.5 发布,自动化开发助理

一、前言Diboot2.0.5版本已于近日发布,在此次发布中,我们新增了file-starter组件,完善了iam-starter组件,对core核心进行了相关优化,让devtools也支持对IAM...

微软推出Copilot Actions,使用人工智能自动执行重复性任务

IT之家11月19日消息,微软在今天举办的Ignite大会上宣布了一系列新功能,旨在进一步提升Microsoft365Copilot的智能化水平。其中最引人注目的是Copilot...

Electron 使用Selenium和WebDriver

本节我们来学习如何在Electron下使用Selenium和WebDriver。SeleniumSelenium是ThoughtWorks提供的一个强大的基于浏览器的开源自动化测试工具...

Quick &#39;n Easy Web Builder 11.1.0设计和构建功能齐全的网页的工具

一个实用而有效的应用程序,能够让您轻松构建、创建和设计个人的HTML网站。Quick'nEasyWebBuilder是一款全面且轻巧的软件,为用户提供了一种简单的方式来创建、编辑...