写点什么

DawnSql 快速入门

作者:陈飞
  • 2023-02-24
    四川
  • 本文字数:4628 字

    阅读完需:约 15 分钟

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

  2. 下载 DBeaverWeb 的 war 包下载 DBeaverWeb 的 war 包

  3. 启动 DBeaverWeb启动 DBeaverWeb

  4. DBeaverWeb 的源码DBeaverWeb 的源码

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 wudafucreate schema wudafu;
-- 或者-- 创建 schema wudafucreate 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=dafudafu 为上面 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 得到结果



实际结果是 8 条



权限视图实现的原理:通过方法将表和表的读写权限绑定到用户组,这样用户组执行 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;
复制代码



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} * * * * *');
复制代码


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


用户头像

陈飞

关注

DawnSql开源分布式数据库的作者 2020-02-13 加入

还未添加个人简介

评论

发布
暂无评论
DawnSql快速入门_微服务_陈飞_InfoQ写作社区