Netty游戏服务器实战开发(11):Spring+mybatis 手写分库分表策略(续)

释放双眼,带上耳机,听听看~!

在大型网络游戏中,传统的游戏服务器无法满足性能上的需求。所以有了分布式和微服务新起,在传统web服务器中,我们保存用户等信息基本都是利用一张单表搞定,但是在游戏服务器中,由于要求比较高,我们不能存在大表操作,即分库分表策略。在以前的文章中有关介绍分库分表的,下面我们来实战一下,首先我们做一个这样的计算。

在博主开源的游戏服务器中有这样一个场景:玩家数据保存到player表中,其中将游戏数据库分为100个数据库(可动态扩展),每个库中有player表10张。一张表我们打算最多存放2w条数据。所以我们可以负载总用户=100(库)x10(表)x20000=2千万。

但是我们不可能手动去创建这么多表,所以我们会编写脚本去执行,提供一个sql模板,然后批量去创建库。首先我们要创建100个数据库。脚本如下:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1user=root
2password=123456
3socket=/usr/local/mysql/mysql.sock
4mycmd="mysql -u$user -p$password -S $socket"
5for  i in `seq 0 99`
6do
7#   $mycmd -e "create database game_service_0$i"
8  if [ $i -lt 10 ]
9  then
10    echo create database game_service_0$i"
11     mysql -u root -e "create database game_service_0$i";
12  fi
13  if [ $i -ge 10 ]
14     then
15     echo " create database  game_service$i"
16     mysql -u root -e "create database game_service_$i";
17  fi
18done
19
20
21

从脚本中我们可以看到,循环创建100个名称叫做game_service_*数据库。

然后我们在编写脚本来执行sql语句,同样我们编写如下脚本,脚本功能主要是在一百个库里面执行sql文件中的内容


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1databaseCount=99
2
3databaseBaseName="game_service_"
4
5sql_str=$(cat $1)
6
7for  i in `seq 0 $databaseCount`
8do
9if [ $i -lt 10 ]
10then
11db_name=$databaseBaseName"0"$i
12echo "executor sql in database $db_name"
13mysql -u root  $db_name -e "$sql_str"
14echo "executor over"
15fi
16if [ $i -ge 10 ]
17then
18db_name1=$databaseBaseName$i
19echo "exectuor sql in database $db_name1"
20mysql -u root  $db_name1 -e "${sql_str}"
21echo "executor over"
22fi
23done
24
25
26

有了这些简单的脚本我们来编写一个能够创建10个库的sql语句内容如下


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
1/*
2 Navicat Premium Data Transfer
3 Date: 23/10/2018 20:00:18
4*/
5
6SET NAMES utf8mb4;
7SET FOREIGN_KEY_CHECKS = 0;
8
9-- ----------------------------
10-- Table structure for player_0
11-- ----------------------------
12DROP TABLE IF EXISTS `player_0`;
13CREATE TABLE `player_0`  (
14  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
15  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
16  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
17  `birthday` date NULL DEFAULT NULL COMMENT '生日',
18  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
19  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
20  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
21  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
22  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
23  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
24  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
25  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
26  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
27  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
28  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
29  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
30  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
31  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
32  PRIMARY KEY (`player_id`) USING BTREE,
33  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
34) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
35
36
37DROP TABLE IF EXISTS `player_1`;
38CREATE TABLE `player_1`  (
39  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
40  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
41  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
42  `birthday` date NULL DEFAULT NULL COMMENT '生日',
43  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
44  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
45  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
46  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
47  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
48  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
49  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
50  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
51  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
52  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
53  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
54  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
55  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
56  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
57  PRIMARY KEY (`player_id`) USING BTREE,
58  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
59) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
60
61
62DROP TABLE IF EXISTS `player_2`;
63CREATE TABLE `player_2`  (
64  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
65  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
66  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
67  `birthday` date NULL DEFAULT NULL COMMENT '生日',
68  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
69  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
70  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
71  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
72  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
73  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
74  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
75  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
76  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
77  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
78  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
79  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
80  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
81  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
82  PRIMARY KEY (`player_id`) USING BTREE,
83  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
84) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
85
86
87DROP TABLE IF EXISTS `player_3`;
88CREATE TABLE `player_3`  (
89  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
90  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
91  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
92  `birthday` date NULL DEFAULT NULL COMMENT '生日',
93  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
94  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
95  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
96  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
97  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
98  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
99  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
100  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
101  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
102  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
103  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
104  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
105  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
106  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
107  PRIMARY KEY (`player_id`) USING BTREE,
108  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
109) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
110
111
112DROP TABLE IF EXISTS `player_4`;
113CREATE TABLE `player_4`  (
114  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
115  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
116  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
117  `birthday` date NULL DEFAULT NULL COMMENT '生日',
118  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
119  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
120  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
121  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
122  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
123  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
124  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
125  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
126  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
127  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
128  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
129  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
130  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
131  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
132  PRIMARY KEY (`player_id`) USING BTREE,
133  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
134) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
135
136DROP TABLE IF EXISTS `player_5`;
137CREATE TABLE `player_5`  (
138  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
139  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
140  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
141  `birthday` date NULL DEFAULT NULL COMMENT '生日',
142  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
143  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
144  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
145  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
146  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
147  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
148  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
149  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
150  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
151  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
152  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
153  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
154  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
155  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
156  PRIMARY KEY (`player_id`) USING BTREE,
157  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
158) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
159
160DROP TABLE IF EXISTS `player_6`;
161CREATE TABLE `player_6`  (
162  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
163  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
164  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
165  `birthday` date NULL DEFAULT NULL COMMENT '生日',
166  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
167  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
168  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
169  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
170  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
171  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
172  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
173  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
174  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
175  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
176  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
177  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
178  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
179  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
180  PRIMARY KEY (`player_id`) USING BTREE,
181  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
182) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
183
184
185DROP TABLE IF EXISTS `player_7`;
186CREATE TABLE `player_7`  (
187  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
188  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
189  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
190  `birthday` date NULL DEFAULT NULL COMMENT '生日',
191  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
192  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
193  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
194  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
195  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
196  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
197  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
198  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
199  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
200  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
201  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
202  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
203  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
204  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
205  PRIMARY KEY (`player_id`) USING BTREE,
206  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
207) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
208
209
210DROP TABLE IF EXISTS `player_8`;
211CREATE TABLE `player_8`  (
212  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
213  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
214  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
215  `birthday` date NULL DEFAULT NULL COMMENT '生日',
216  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
217  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
218  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
219  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
220  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
221  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
222  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
223  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
224  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
225  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
226  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
227  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
228  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
229  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
230  PRIMARY KEY (`player_id`) USING BTREE,
231  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
232) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
233
234DROP TABLE IF EXISTS `player_9`;
235CREATE TABLE `player_9`  (
236  `player_id` bigint(32) NOT NULL COMMENT '玩家id',
237  `player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名称',
238  `open_id` varbinary(100) NOT NULL COMMENT 'openid',
239  `birthday` date NULL DEFAULT NULL COMMENT '生日',
240  `gold_num` int(11) NULL DEFAULT 0 COMMENT '金币数量',
241  `diamond` int(11) NULL DEFAULT 0 COMMENT '钻石数量',
242  `player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家头像',
243  `last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登录时间',
244  `coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '当前登录时间',
245  `buttle_num` int(11) NULL DEFAULT NULL COMMENT '闯关进度',
246  `ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位赛等级(包括历史赛季),规则程序定',
247  `vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等级',
248  `player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等级',
249  `exp_num` int(11) NULL DEFAULT NULL COMMENT '经验值',
250  `max_source` int(11) NULL DEFAULT NULL COMMENT '历史最高分',
251  `tong_id` bigint(32) NULL DEFAULT NULL COMMENT '战队id',
252  `usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',
253  `add_money_num` int(11) NULL DEFAULT NULL COMMENT '累计充值数量',
254  PRIMARY KEY (`player_id`) USING BTREE,
255  UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE
256) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;
257
258SET FOREIGN_KEY_CHECKS = 1;
259
260
261

当我们执行脚本后得到100个库中有10个表。因此我们准备工作做完。接下来我们要编写程序,使得我们通过用户的uid来定位到用户在某个库中的某个表的位置。。效果图如下:

游戏项目后台在短连接部分玩家数据,所以我们在技术选型上采用spring+mybatis。分库分表的原理我们在

springMVC +mybatis+mysql多套数据源配置
中已经介绍相关的技术。此处省略部分代码,主要讲解一下动态数据源的核心配置。

首先我们来看分库分表策略DbManager


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
1
2
3import org.slf4j.Logger;
4import org.slf4j.LoggerFactory;
5
6/**
7 * 分库分表策略
8 *
9 * @author twjitm - [Created on 2018-10-22 11:50]
10 */
11public class DbManager {
12    private static Logger logger = LoggerFactory.getLogger(DbManager.class);
13
14    /**
15     * 分表数量
16     */
17    private static final int TABLE_SHARING_COUNT = 10;
18    /**
19     * 分库总数
20     */
21    private static final int DB_SHARING_COUNT = 100;
22    /**
23     * 数据库前缀名称
24     */
25    private static final String DB_BASE_NAME = "game_service_";
26
27
28    /**
29     * 获取数据库名称索引
30     *
31     * @param playerId 根据玩家的uid来进行分库
32     * @return 返回库索引
33     */
34    public static String getDataBaseName(long playerId) {
35        int i = (int) (playerId % DB_SHARING_COUNT);
36        if (i < TABLE_SHARING_COUNT) {
37            return DB_BASE_NAME + "0" + i;
38        } else {
39            return DB_BASE_NAME + i;
40        }
41    }
42
43    /**
44     * 获取表索引
45     */
46    public static int getDataTableIndex(long playerId) {
47        return (int) (playerId % DB_SHARING_COUNT);
48
49    }
50}
51
52
53

通过程序,我们生成100个jdbc连接,内容太多,没有截图完整。

然后利用spring 管理这些连写对象,通过程序生成100个连接对象

然后把这100个连接对象放到一个map集和中,添加一个application-map.xml

在动态数据源的地方引用这个map


1
2
3
4
5
6
7
8
9
1    <!--动态数据源的配置-->
2    <bean id="dynamicDataSource" class="com.twjitm.game.server.core.database.mybatis.DynamicDataSource">
3        <property name="targetDataSources" ref="dbDataSourceMap"/>
4        <!--默认数据源-->
5          <property name="defaultTargetDataSource" ref="game_service_00"/>
6
7    </bean>
8
9

为了实现分表,我们编写一个基础类,当有需要使用分表的时候,mybatis对应的实体类必须继承此类对象


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1/**
2 * <pre>
3 *     需要分表的字段必须继承这个类,并且需要设置index索引
4 * <pre/>
5 * @author twjitm - [Created on 2018-10-22 11:44]
6 */
7public class BasePo {
8    protected int tableIndex;
9
10    public int getTableIndex() {
11        return tableIndex;
12    }
13
14    public void setTableIndex(int tableIndex) {
15        this.tableIndex = tableIndex;
16    }
17}
18
19
20

在使用的时候我们在dao层

后记:上篇文章有小伙伴留言给我说事务配置失效

博主我测试没有问题呀?

给TA打赏
共{{data.count}}人
人已打赏
安全技术

Bootstrap 4 Flex(弹性)布局

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索