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 集群(推荐使用) 的方法
具体使用方法:
- 设置完成后,进入安装文件目录下,启动 DawnSql 数据库:
安装并激活 DawnSql<br/> - 下载 DBeaverWeb 的 war 包
下载 DBeaverWeb 的 war 包<br/> - 启动 DBeaverWeb
启动 DBeaverWeb<br/> - 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 得到结果
实际结果是 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} * * * * *');
定时任务中的任务,在集群中是负载均衡的,当节点故障时,定时任务会进行故障转移