日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2024/3/13 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Netty游戏服务器实战开发(11):Spring+mybatis 手写分库分表策略(续) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在大型網絡游戲中,傳統的游戲服務器無法滿足性能上的需求。所以有了分布式和微服務新起,在傳統web服務器中,我們保存用戶等信息基本都是利用一張單表搞定,但是在游戲服務器中,由于要求比較高,我們不能存在大表操作,即分庫分表策略。在以前的文章中有關介紹分庫分表的,下面我們來實戰一下,首先我們做一個這樣的計算。

在博主開源的游戲服務器中有這樣一個場景:玩家數據保存到player表中,其中將游戲數據庫分為100個數據庫(可動態擴展),每個庫中有player表10張。一張表我們打算最多存放2w條數據。所以我們可以負載總用戶=100(庫)x10(表)x20000=2千萬。

但是我們不可能手動去創建這么多表,所以我們會編寫腳本去執行,提供一個sql模板,然后批量去創建庫。首先我們要創建100個數據庫。腳本如下:

user=root password=123456 socket=/usr/local/mysql/mysql.sock mycmd="mysql -u$user -p$password -S $socket" for i in `seq 0 99` do # $mycmd -e "create database game_service_0$i"if [ $i -lt 10 ]thenecho create database game_service_0$i"mysql -u root -e "create database game_service_0$i"; fiif [ $i -ge 10 ]thenecho " create database game_service$i"mysql -u root -e "create database game_service_$i";fi done

從腳本中我們可以看到,循環創建100個名稱叫做game_service_*數據庫。

然后我們在編寫腳本來執行sql語句,同樣我們編寫如下腳本,腳本功能主要是在一百個庫里面執行sql文件中的內容

databaseCount=99databaseBaseName="game_service_"sql_str=$(cat $1)for i in `seq 0 $databaseCount` do if [ $i -lt 10 ] then db_name=$databaseBaseName"0"$i echo "executor sql in database $db_name" mysql -u root $db_name -e "$sql_str" echo "executor over" fi if [ $i -ge 10 ] then db_name1=$databaseBaseName$i echo "exectuor sql in database $db_name1" mysql -u root $db_name1 -e "${sql_str}" echo "executor over" fi done

有了這些簡單的腳本我們來編寫一個能夠創建10個庫的sql語句內容如下

/*Navicat Premium Data TransferDate: 23/10/2018 20:00:18 */SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0;-- ---------------------------- -- Table structure for player_0 -- ---------------------------- DROP TABLE IF EXISTS `player_0`; CREATE TABLE `player_0` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_1`; CREATE TABLE `player_1` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_2`; CREATE TABLE `player_2` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_3`; CREATE TABLE `player_3` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_4`; CREATE TABLE `player_4` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_5`; CREATE TABLE `player_5` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_6`; CREATE TABLE `player_6` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_7`; CREATE TABLE `player_7` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_8`; CREATE TABLE `player_8` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;DROP TABLE IF EXISTS `player_9`; CREATE TABLE `player_9` (`player_id` bigint(32) NOT NULL COMMENT '玩家id',`player_name` varchar(100) CHARACTER SET latin1 COLLATE latin1_swedish_ci NOT NULL COMMENT '玩家名稱',`open_id` varbinary(100) NOT NULL COMMENT 'openid',`birthday` date NULL DEFAULT NULL COMMENT '生日',`gold_num` int(11) NULL DEFAULT 0 COMMENT '金幣數量',`diamond` int(11) NULL DEFAULT 0 COMMENT '鉆石數量',`player_head` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '玩家頭像',`last_logout_time` datetime(0) NULL DEFAULT NULL COMMENT '上次退出登錄時間',`coun_login_time` datetime(0) NULL DEFAULT NULL COMMENT '當前登錄時間',`buttle_num` int(11) NULL DEFAULT NULL COMMENT '闖關進度',`ladder_lv` varchar(255) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL COMMENT '排位賽等級(包括歷史賽季),規則程序定',`vip_lv` int(11) NULL DEFAULT NULL COMMENT 'vip等級',`player_lv` int(11) NULL DEFAULT 0 COMMENT '玩家等級',`exp_num` int(11) NULL DEFAULT NULL COMMENT '經驗值',`max_source` int(11) NULL DEFAULT NULL COMMENT '歷史最高分',`tong_id` bigint(32) NULL DEFAULT NULL COMMENT '戰隊id',`usable` int(2) NULL DEFAULT NULL COMMENT '是否可用',`add_money_num` int(11) NULL DEFAULT NULL COMMENT '累計充值數量',PRIMARY KEY (`player_id`) USING BTREE,UNIQUE INDEX `player_index`(`player_id`, `open_id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

當我們執行腳本后得到100個庫中有10個表。因此我們準備工作做完。接下來我們要編寫程序,使得我們通過用戶的uid來定位到用戶在某個庫中的某個表的位置。。效果圖如下:


游戲項目后臺在短連接部分玩家數據,所以我們在技術選型上采用spring+mybatis。分庫分表的原理我們在

springMVC +mybatis+mysql多套數據源配置
中已經介紹相關的技術。此處省略部分代碼,主要講解一下動態數據源的核心配置。

首先我們來看分庫分表策略DbManager

import org.slf4j.Logger; import org.slf4j.LoggerFactory;/*** 分庫分表策略** @author twjitm - [Created on 2018-10-22 11:50]*/ public class DbManager {private static Logger logger = LoggerFactory.getLogger(DbManager.class);/*** 分表數量*/private static final int TABLE_SHARING_COUNT = 10;/*** 分庫總數*/private static final int DB_SHARING_COUNT = 100;/*** 數據庫前綴名稱*/private static final String DB_BASE_NAME = "game_service_";/*** 獲取數據庫名稱索引** @param playerId 根據玩家的uid來進行分庫* @return 返回庫索引*/public static String getDataBaseName(long playerId) {int i = (int) (playerId % DB_SHARING_COUNT);if (i < TABLE_SHARING_COUNT) {return DB_BASE_NAME + "0" + i;} else {return DB_BASE_NAME + i;}}/*** 獲取表索引*/public static int getDataTableIndex(long playerId) {return (int) (playerId % DB_SHARING_COUNT);} }

通過程序,我們生成100個jdbc連接,內容太多,沒有截圖完整。

然后利用spring 管理這些連寫對象,通過程序生成100個連接對象

然后把這100個連接對象放到一個map集和中,添加一個application-map.xml

在動態數據源的地方引用這個map

<!--動態數據源的配置--><bean id="dynamicDataSource" class="com.twjitm.game.server.core.database.mybatis.DynamicDataSource"><property name="targetDataSources" ref="dbDataSourceMap"/><!--默認數據源--><property name="defaultTargetDataSource" ref="game_service_00"/></bean>

為了實現分表,我們編寫一個基礎類,當有需要使用分表的時候,mybatis對應的實體類必須繼承此類對象

/*** <pre>* 需要分表的字段必須繼承這個類,并且需要設置index索引* <pre/>* @author twjitm - [Created on 2018-10-22 11:44]*/ public class BasePo {protected int tableIndex;public int getTableIndex() {return tableIndex;}public void setTableIndex(int tableIndex) {this.tableIndex = tableIndex;} }

在使用的時候我們在dao層

后記:上篇文章有小伙伴留言給我說事務配置失效

博主我測試沒有問題呀?

總結

以上是生活随笔為你收集整理的Netty游戏服务器实战开发(11):Spring+mybatis 手写分库分表策略(续)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。