DawnSql快速入门

简介: DawnSql开源分布式数据库,快速入门

1、设置配置文件

1.1、配置文件的位置

安装文件解压后,进入 config 目录,配置文件:default-config.xml

1.2、设置超级管理员的 root token

 <!-- 超级管理员的 root token, 用户可以直接来设置一个 root token -->
 <!-- 本例中 root token 为 dafu -->
<property name="root_token" value="dafu"/>

DawnSql 中用户是通过 user_token 来区分用户之间的访问权限的。
例如:
在通过 jdbc 访问的时候,user_token 是必须要设置的。

        Class.forName("org.apache.ignite.IgniteJdbcDriver");
        String user_token = "my_token";
        String url = "jdbc:ignite:thin://127.0.0.1:10800/public?lazy=true&userToken=" + user_token;
        Connection conn = DriverManager.getConnection(url);

1.3、用户是否实现了 log 事务接口。默认是没有实现,这个需要用户根据自己的实际需求来实现。

<!-- 设置实现 log 事务接口的类 -->
<!--
<property name="myLogCls" value="org.gridgain.smart.logClient.MyLogTransactionClient"/>
-->

1.4、是否实现了初始化后就执行的方法

既数据库系统,初始化完成后,马上执行的方法

<!-- 设置启动的时候,初始化 rpc 服务器 -->
<!-- org.dawn.rpc.MyRpcStartImpl 是实现了 IDawnSqlStart 接口的类 -->
<!-- 不设置则不启动这个服务,具体代码可以参看开源的例子 -->
<property name="startAppCls" value="org.dawn.rpc.MyRpcStartImpl"/>

默认的是开启 DBeaverWeb 访问 DawnSql 集群(推荐使用) 的方法
具体使用方法:

  1. 设置完成后,进入安装文件目录下,启动 DawnSql 数据库:
    安装并激活 DawnSql<br/>
  2. 下载 DBeaverWeb 的 war 包
    下载 DBeaverWeb 的 war 包<br/>
  3. 启动 DBeaverWeb
    启动 DBeaverWeb<br/>
  4. DBeaverWeb 的源码
    DBeaverWeb 的源码<br/>

1.5、创建表的模板 (这个是必须要设置的)

例子中设置了两个模板:
base 模板:复制模式,支持事务
manage 模板:分区模式,同一份数据,在集群中备份 3 次,支持事务

<!-- 创建表的模板 -->
<property name="templateConfiguration">
    <map key-type="java.lang.String" value-type="org.apache.ignite.configuration.TableTemplateConfiguration">
        <entry key="base">
            <bean class="org.apache.ignite.configuration.TableTemplateConfiguration">
                <property name="templateValue" value="template=REPLICATED,ATOMICITY=TRANSACTIONAL"></property>
                <property name="description" value="复制模式,来保存数据!"></property>
            </bean>
        </entry>
        <entry key="manage">
            <bean class="org.apache.ignite.configuration.TableTemplateConfiguration">
                <property name="templateValue" value="template=partitioned,backups=3,ATOMICITY=TRANSACTIONAL"></property>
                <property name="description" value="分片模式,来保存数据!"></property>
            </bean>
        </entry>
    </map>
</property>

1.6、设置多用户组(默认是支持多用户组的)

        <!-- 是否启用多用户组 -->
        <property name="multiUserGroup" value="true"/>

1.7、添加其他节点

        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="ipFinder">
                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
                        <property name="addresses">
                            <list>
                                <!-- 分布式环境替换实际的 ip 和 端口 -->
                                <!-- 例如:配置多个台机器机器 -->
                                <!-- 47500..47509 表示端口范围 -->
                                <!-- <value>ip地址一:47500..47509</value> -->
                                <!-- <value>ip地址二:47500..47509</value> -->
                                <!-- <value>ip地址三:47500..47509</value> -->
                                <value>127.0.0.1:47500..47509</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>

2、创建 schema

只有 root 用户,才能创建和修改 schema
创建 schema 有两种写法:
具体用法:创建和删除 schema

-- 创建 schema wudafu
create schema wudafu;

-- 或者
-- 创建 schema wudafu
create schema if not exists wudafu;

3、为 schema 添加用户组

只有 root 用户,才能设置用户组
具体用法:添加删除用户组

-- 添加用户组
add_user_group('wudafu_group', 'wudafu_token', 'all', 'wudafu');
-- 通过 user_token 获取用户组
get_user_group('wudafu_token');

add_user_group 为内置函数它有四个参数:第一个:用户组的名字,第二个:用户的 user_token 用户访问数据库,第三个:只能选择 all, dml, ddl,第四个:schema 的名字。
add_user_group 的意思是为 schema 添加一个用户组。包含:用户组名称、user_token 和它的操作权限。

4、添加表并插入数据

例如:用 root 的 token 或者是上面例子的 myy_token
如果用 DBeaverWeb 来操作,只需要输入 root 的 token 或者 myy_token
如果用 JDBC 连接字符串为:jdbc:ignite:thin://127.0.0.1:10800/public?lazy=true&userToken=dafu
dafu 为上面 root 的 userToken
也可以用 myy_token ,因为它的有添加表的权限。

DROP TABLE IF EXISTS public.Categories; 
-- 产品类型表
CREATE TABLE IF NOT EXISTS public.Categories (
     -- 产品类型ID
    CategoryID INTEGER NOT NULL auto,
    -- 产品类型名
    CategoryName VARCHAR(15) NOT NULL,
    -- 类型说明
    Description VARCHAR,
    -- 产品样本
    Picture VARCHAR,
    PRIMARY KEY (CategoryID)
) WITH "template=manage";

CREATE INDEX IF NOT EXISTS Categories_CategoryName_idx ON public.Categories (CategoryName);

INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Beverages','Soft drinks, coffees, teas, beers, and ales', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Condiments','Sweet and savory sauces, relishes, spreads, and seasonings', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Confections','Desserts, candies, and sweet breads', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Dairy Products','Cheeses', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Grains/Cereals','Breads, crackers, pasta, and cereal', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Meat/Poultry','Prepared meats', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Produce','Dried fruit and bean curd', '');
INSERT INTO public.Categories (CategoryName, Description, Picture) VALUES('Seafood','Seaweed and fish', '');

添加表要注意,如果是联合主键,可以按照业务的特点,将一个主键设置为 affinity_key
例如:

-- 订单详情表
CREATE TABLE wudagui.OrderDetails (
    -- 订单编号
    OrderID INTEGER NOT NULL,
    -- 产品编号
    ProductID INTEGER NOT NULL,
    -- 单价
    UnitPrice DECIMAL(10,4) DEFAULT 0,
    -- 订购数量
    Quantity SMALLINT(2) DEFAULT 1,
    -- 折扣
    Discount REAL(8,0) NOT NULL,
    PRIMARY KEY (OrderID, ProductID)
) WITH "template=manage,affinity_key=ProductID";

affinity_key 亲和键,意思是将相同键值的数据,分配到同一节点。这样执行 SQL 的时候,同一节点的数据,就不需要移动了!

5、给用户组分配访问权限

具体用法:给用户组分配访问权限

-- 为用户组:wudafu_group,添加查询 public.Categories 表的权限。
-- 让其只能查询 CategoryName <> 'Seafood' 且只能查询列 CategoryName, Description 的数据
my_view('wudafu_group', "SELECT CategoryName, Description from public.Categories where CategoryName <> 'Seafood'");

用 wudafu_group 的 user_token: wudafu_token 登录 DBeaverWeb 查询 public.Categories 得到结果

rm_1.jpg

实际结果是 8 条
rm_2.jpg

权限视图实现的原理:通过方法将表和表的读写权限绑定到用户组,这样用户组执行 sql 语句的时候,就会去读取权限视图的 ast ,最后在组合成新 ast 执行。

6、NoSql 的支持

具体用法:trans(Sql或者NoSql 的序列) 事务函数

-- 创建一个分区的缓存
noSqlCreate({"table_name": "my_cache", "mode": "partitioned"});

-- 在缓存中,插入数据
noSqlInsert({"table_name": "my_cache", "key": "000A", "value": {"name": "吴大富", "age": 100}});

-- 读取缓存中的数据
noSqlGet({"table_name": "my_cache", "key": "000A"});

7、事务的支持

具体用法:NoSql 的支持

function update_table(CategoryID:int, CategoryName:string)
{
    let lst = [['update public.Categories set CategoryName = ? where UserID = ?', [CategoryName, CategoryID]]];
    lst.add(noSqlDeleteTran({"table_name": "my_cache", "key": CategoryID}));
    trans(lst);
}

执行事务需要调用 DawnSql 的 trans 方法。该方法会将序列中的 sql 或 no sql 都会转换成 key -value 形式,然后执行二阶段提交

8、DawnSql 语法的简介

具体用法:DawnSql语法

-- 1、输入一个字符串,输出一个前缀 DawnSql 的字符串
function my_str(line:string)
{
   concat('DawnSql ', line);
}

-- 2、当把 DawnSql函数中提交到数据后,就可以在 sql 和 DawnSql 中使用这个函数
select my_str(CATEGORYNAME) from PUBLIC.categories;

d_1.jpeg

d_2.jpg

9、DawnSql 的扩展

具体用法:DawnSql 的扩展

9.1、Java 代码

package org.dawnsql.lib;

import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MyUtil {

    public String getNow()
    {
        Timestamp timestamp = new Timestamp(System.currentTimeMillis());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        System.out.println(simpleDateFormat.format(new Date(timestamp.getTime())));

        return simpleDateFormat.format(new Date(timestamp.getTime()));
    }
}

9.2、注册成 DawnSql 中的方法

add_func({"method_name":"getNow","java_method_name":"getNow","cls_name":"org.dawnsql.lib.MyUtil","return_type":"String","descrip":"","lst":[]});

10、分布式定时任务

具体用法:分布式定时任务

-- 每隔两分钟,重复执行 30 次 getNow 方法
add_job('getNow', [], '{2,30} * * * * *');

定时任务中的任务,在集群中是负载均衡的,当节点故障时,定时任务会进行故障转移

相关文章
|
6月前
|
存储 人工智能 NoSQL
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
MongoDB Atlas 的向量搜索功能为语义搜索和 RAG 提供了一个高效的数据库管理平台。在这个全新的应用场景下,Atlas 的向量检索能力支持开发者实现高效的知识检索和增强型生成应用,使其在智能客服、知识问答、个性化推荐等场景中大放异彩。结合生成式模型的 RAG 应用,MongoDB Atlas 提供了从数据存储到智能生成的完整解决方案,展现出其在现代应用中的巨大潜力。希望本文能够帮助大家更好地理解 MongoDB Atlas 的语义搜索功能和 RAG 的实际应用。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
|
12月前
|
Kubernetes Cloud Native 持续交付
探索云原生架构:打造弹性可扩展的应用
【9月更文挑战第29天】在云计算的浪潮中,云原生架构成为企业追求高效、灵活和可靠服务的关键。本文将深入解析云原生的概念,探讨如何利用容器化、微服务和持续集成/持续部署(CI/CD)等技术构建现代化应用。我们将通过一个简易的代码示例,展示如何在Kubernetes集群上部署一个基于Node.js的应用,从而揭示云原生技术的强大能力和潜在价值。
181 6
|
人工智能 自然语言处理 搜索推荐
评测:AI客服接入钉钉与微信的对比分析
【8月更文第22天】随着人工智能技术的发展,越来越多的企业开始尝试将AI客服集成到自己的业务流程中。本文将基于《10分钟构建AI客服并应用到网站、钉钉或微信中》的解决方案,详细评测AI客服在钉钉和微信中的接入流程及实际应用效果,并结合个人体验分享一些心得。
10290 10
|
存储 缓存 NoSQL
Redis问题之一致性Hash是如何解决哈希+取余方法中的稳定性问题的
Redis问题之一致性Hash是如何解决哈希+取余方法中的稳定性问题的
156 10
|
前端开发 开发者
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。
在前端开发中,webpack 作为模块打包工具,其 DefinePlugin 插件可在编译时动态定义全局变量,支持环境变量定义、配置参数动态化及条件编译等功能。本文阐述 DefinePlugin 的原理、用法及案例,包括安装配置、具体示例(如动态加载资源、配置接口地址)和注意事项,帮助开发者更好地利用此插件优化项目。
375 0
|
敏捷开发 前端开发 数据管理
深入理解自动化测试框架设计原则
【4月更文挑战第1天】 在快速迭代的软件开发周期中,自动化测试已经成为确保软件质量和加速产品上市的关键步骤。本文将探讨自动化测试框架的设计原则,旨在帮助读者构建一个健壮、灵活且可维护的自动化测试环境。通过分析结构设计、模块划分、数据管理等核心要素,我们将讨论如何实现一个高效的自动化测试框架,并考虑其对测试覆盖率和可靠性的影响。
|
XML 数据管理 编译器
Qt+GDAL开发笔记(二):在windows系统msvc207x64编译GDAL库、搭建开发环境和基础Demo
上一篇使用mingw32版本的gdal,过程曲折,为更好的更方便搭建环境,在windows上msvc方式对于库比较友好。
|
安全 Java 数据库
Spring Boot 3 + JWT + Security 联手打造安全帝国:一篇文章让你掌握未来!
`Spring Security`已经成为`java`后台权限校验的第一选择.今天就通过读代码的方式带大家深入了解一下Security,本文主要是基于开源项目[spring-boot-3-jwt-security](https://github.com/ali-bouali/spring-boot-3-jwt-security)来讲解Spring Security + JWT(Json Web Token).实现用户鉴权,以及权限校验. 所有代码基于`jdk17+`构建.现在让我们开始吧!
3491 1
 Spring Boot 3 + JWT + Security 联手打造安全帝国:一篇文章让你掌握未来!
西门子S7-300开关量模块和模拟量模块通道地址如何分配?
根据机架上模块的类型,地址可以设定为输入I或输出O。数字量I/O模块每个槽占4个字节地址,也就是32个I/O点,1个字节8个位所以4个字节32个位。
西门子S7-300开关量模块和模拟量模块通道地址如何分配?
|
缓存 监控 安全
【网络安全】等保测评-安全通信网络
【网络安全】等保测评-安全通信网络
531 0

热门文章

最新文章