|
| 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 <= (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 >= 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