Skip to content

Commit 9c99bcd

Browse files
committed
add mgr dm8 fit in doc
1 parent 529f7cc commit 9c99bcd

File tree

2 files changed

+187
-2
lines changed

2 files changed

+187
-2
lines changed

docs/WeBASE-Console-Suit/articles/dameng_db_fit_in.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1-
# 区块链教程 | 使用达梦数据库(DM)对WeBASE进行适配
1+
# 区块链教程 | 使用达梦数据库(DM)对WeBASE进行适配(一)
22

33
作者:梁锦辉
44

55
作为一个开放、功能丰富的区块链平台, WeBASE致力于提高区块链开发者的运维与管理效率。同时为使用者提供可以适配达梦数据库(DM)(信创环境)的兼容特性;
6-
以下演示,我们通过WeBASE-Sign,为例子做的适配改造。
6+
7+
以下演示,我们通过**WeBASE-Sign**,为例子做的适配改造。
78

89
### |前期准备
910

Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
# 区块链教程 | 使用达梦数据库(DM)对WeBASE进行适配 (二)
2+
作者:梁锦辉
3+
4+
作为一个开放、功能丰富的区块链平台, WeBASE致力于提高区块链开发者的运维与管理效率。同时为使用者提供可以适配达梦数据库(DM)(信创环境)的兼容特性;
5+
6+
以下演示,我们通过**WeBASE-Node-Manager**,为例子做的适配改造。
7+
8+
### |前期准备
9+
#### 达数据库的安装
10+
安装指南可以从达梦数据库(DM)官网获取:https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html
11+
12+
#### 获取达蒙数据库依赖配置
13+
可以在maven或者gradle配置中引入
14+
15+
``` maven依赖配置示例
16+
<dependency>
17+
<groupId>com.dameng</groupId>
18+
<artifactId>DmJdbcDriver18</artifactId>
19+
<version>8.1.1.193</version>
20+
</dependency>
21+
```
22+
23+
``` gradle依赖配置示例
24+
compile 'com.dameng:DmJdbcDriver18:8.1.1.193'
25+
```
26+
27+
28+
如果不同DM版本可以从数据库的安装目录下相关说明文档下获取到,
29+
配置方法也可以在数据库安装目录下的\dmdbms\drivers\jdbc\readme.txt中看到依赖配置信息。
30+
31+
### |DM结合WeBASE-Node-Manager的适配实现
32+
当前WeBASE-Node-Manager是使用的MYSQL作为数据库,达梦数据对MYSQL的兼容性也是比较优化,但存在有些关键语法的问题导致SQL执行不通过;
33+
设计思路,此次改造通过增加使用开关来决定是否达启用达梦数据库(DM),同时也不影响原来WeBASE-Node-Manager支持MYSQL的能力,改造结果就是同时能支持MYSQL或者达梦数据库(DM);
34+
35+
36+
修改配置文件:src/main/resources/application.yml
37+
- 切换jdbc的driver为DmDriver
38+
- 设置mybatis的`isDm8`变量
39+
40+
```
41+
driver-class-name: com.mysql.cj.jdbc.Driver
42+
driver-class-name: dm.jdbc.driver.DmDriver
43+
hikari:
44+
connection-test-query: SELECT 1 FROM DUAL
45+
connection-timeout: 30000
46+
47+
48+
49+
mybatis:
50+
mapper-locations: classpath:mapper/*.xml
51+
configuration:
52+
variables:
53+
isDm8: true
54+
55+
```
56+
57+
由于DM的sql语法和mysql有部分差异,因此修改:
58+
59+
修改相关mapper的Java类或xml文件,通过mybatis的`isDm8`变量进行判断
60+
- `tb_stat`表的mapper Java类修改
61+
- `tb_trans_hash`表的mapper xml文件修改
62+
- `tb_block`表的mapper xml文件修改
63+
- `tb_node`表的mapper xml文件修改
64+
- `tb_trans_daily`表的mapper xml文件修改
65+
66+
``` 由于当前版本的mysql是关联查询删除,DM对这样语法支持不太友好,于是修改为通过子持查询方式删除,mysql和DM都支持的;
67+
public interface TbStatMapper {
68+
69+
@Delete({ "delete from tb_stat", "where group_id = #{groupId,jdbcType=INTEGER}" })
70+
int deleteByGroupId(String groupId);
71+
72+
/**
73+
* Delete block height.
74+
*/
75+
@Delete({
76+
"delete from tb_stat as tb ",
77+
"where tb.group_id = #{groupId}",
78+
" and tb.block_number <= (SELECT max(block_number) maxBlock FROM tb_stat where group_id = #{groupId}) - ${blockRetainMax}"})
79+
Integer remove(@Param("groupId") String groupId, @Param("blockRetainMax") BigInteger blockRetainMax);
80+
....
81+
82+
}
83+
84+
```
85+
86+
修改映射文件:src/main/resources/mapper/TranHashMapper.xml (关于myql和DM 忽略插入语法差异,做了适配处理)
87+
```
88+
<insert id="add">
89+
<choose>
90+
<when test="${isDm8}">
91+
insert /*+IGNORE_ROW_ON_DUPKEY_INDEX(${tableName}(trans_hash)) */ into ${tableName}(trans_hash,trans_from,trans_to,block_number,block_timestamp,create_time,modify_time)
92+
values(#{trans.transHash},#{trans.transFrom},#{trans.transTo},#{trans.blockNumber},#{trans.blockTimestamp},NOW(),NOW())
93+
</when>
94+
<otherwise>
95+
insert ignore into ${tableName}(trans_hash,trans_from,trans_to,block_number,block_timestamp,create_time,modify_time)
96+
values(#{trans.transHash},#{trans.transFrom},#{trans.transTo},#{trans.blockNumber},#{trans.blockTimestamp},NOW(),NOW())
97+
</otherwise>
98+
</choose>
99+
100+
</insert>
101+
102+
```
103+
104+
修改映射文件:src/main/resources/mapper/BlockMapper.xml (关于myql和DM 忽略插入语法差异,做了适配处理)
105+
```
106+
<insert id="add">
107+
<choose>
108+
<when test="${isDm8}">
109+
insert /*+IGNORE_ROW_ON_DUPKEY_INDEX(${tableName}(pk_hash)) */ into ${tableName}
110+
(pk_hash,block_number,block_timestamp,trans_count,sealer_index,create_time,modify_time)
111+
values
112+
(#{block.pkHash},#{block.blockNumber},#{block.blockTimestamp},#{block.transCount},#{block.sealerIndex},NOW(),NOW())
113+
</when>
114+
<otherwise>
115+
insert ignore into ${tableName}
116+
(pk_hash,block_number,block_timestamp,trans_count,sealer_index,create_time,modify_time)
117+
values
118+
(#{block.pkHash},#{block.blockNumber},#{block.blockTimestamp},#{block.transCount},#{block.sealerIndex},NOW(),NOW())
119+
</otherwise>
120+
</choose>
121+
122+
</insert>
123+
124+
...
125+
126+
<delete id="remove">
127+
DELETE from ${tableName} as tb
128+
where tb.block_number &lt;= (SELECT max(block_number) maxBlock FROM ${tableName}) - ${blockRetainMax}
129+
</delete>
130+
131+
132+
```
133+
134+
135+
修改映射文件:src/main/resources/mapper/NodeMapper.xml (关于myql和DM 忽略插入语法差异,做了适配处理)
136+
```
137+
<insert id="add" parameterType="com.webank.webase.node.mgr.node.entity.TbNode">
138+
<choose>
139+
<when test="${isDm8}">
140+
insert /*+IGNORE_ROW_ON_DUPKEY_INDEX(tb_node(node_id)) */ into tb_node
141+
(node_id,node_name,group_id,node_ip,p2p_port,description,create_time,modify_time)
142+
values(#{nodeId},#{nodeName},#{groupId},#{nodeIp},#{p2pPort},#{description},NOW(),NOW())
143+
</when>
144+
<otherwise>
145+
insert ignore into tb_node
146+
(node_id,node_name,group_id,node_ip,p2p_port,description,create_time,modify_time)
147+
values(#{nodeId},#{nodeName},#{groupId},#{nodeIp},#{p2pPort},#{description},NOW(),NOW())
148+
</otherwise>
149+
</choose>
150+
</insert>
151+
152+
```
153+
修改映射文件:src/main/resources/mapper/TransDailyMapper.xml (关于myql和DM 忽略插入语法差异,做了适配处理)
154+
```
155+
<select id="listSeventDayOfTransDaily" resultMap="seventDayOfTransMap">
156+
select group_id,trans_day,trans_count from tb_trans_daily where group_id = #{groupId} and trans_day &gt;= DATE_SUB(CURDATE(), INTERVAL '7' DAY)
157+
</select>
158+
159+
<insert id="addTransDailyRow" parameterType="com.webank.webase.node.mgr.transdaily.TbTransDaily">
160+
<choose>
161+
<when test="${isDm8}">
162+
insert /*+IGNORE_ROW_ON_DUPKEY_INDEX(tb_trans_daily(group_id)) */ into tb_trans_daily(group_id,trans_day,trans_count,block_number,create_time,modify_time)
163+
values(#{groupId},#{transDay},#{transCount},#{blockNumber},NOW(),NOW())
164+
</when>
165+
<otherwise>
166+
insert ignore into tb_trans_daily(group_id,trans_day,trans_count,block_number,create_time,modify_time)
167+
values(#{groupId},#{transDay},#{transCount},#{blockNumber},NOW(),NOW())
168+
</otherwise>
169+
</choose>
170+
171+
</insert>
172+
173+
```
174+
175+
176+
使用开关"${isDm8}"适配MYSQL和DMDB;
177+
178+
179+
180+
181+
182+
183+
184+

0 commit comments

Comments
 (0)