汪衛(wèi)兵 廣東郵電職業(yè)技術(shù)學(xué)院 人工智能技術(shù)服務(wù)專業(yè)負(fù)責(zé)人
本文研究的是B2B2C 系統(tǒng),B2B2C 是一種電子商務(wù)類型的網(wǎng)絡(luò)購物商業(yè)模式,為傳統(tǒng)企業(yè)和大中型網(wǎng)商打造以提高商家運(yùn)營能力為核心,提供的電子商務(wù)平臺(tái)。針對多商戶系統(tǒng)中用戶訪問多個(gè)系統(tǒng)數(shù)據(jù)庫的接口并發(fā)問題,提供了一種多商戶系統(tǒng)中多個(gè)商戶如何對應(yīng)自己的數(shù)據(jù)庫的解決方案,該方案可以作為一種實(shí)際可行的解決方案,應(yīng)用到實(shí)際的多商戶系統(tǒng),并具有推廣價(jià)值。
MySQL 是一種關(guān)系型數(shù)據(jù)庫,它是一種C/S 模型(即客戶端和服務(wù)端模型),客戶端通過賬號、密碼來連接服務(wù)器,連接成功之后才可以進(jìn)行數(shù)據(jù)庫的操作(CRUD:增加、刪除、變更、查詢)。本系統(tǒng)采用MySQL 關(guān)系數(shù)據(jù)庫。
Spring-boot 是一種基于Java 的MVC 框架,Spring-boot 提供了一種快速構(gòu)建應(yīng)用程序的方法。作為本web系統(tǒng)的核心技術(shù)框架,完成用戶與服務(wù)器之間B/S 的交互,實(shí)現(xiàn)對數(shù)據(jù)庫的訪問。
MyBatis 是一款優(yōu)秀的持久層框架,它支持定制化 SQL、存儲(chǔ)過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動(dòng)設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生信息,將接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java 對象)映射成數(shù)據(jù)庫中的記錄。
本文基于比較成熟的Java web 框架Spring-boot 和MyBatis進(jìn)行系統(tǒng)設(shè)計(jì),數(shù)據(jù)庫采用 MySQL 關(guān)系數(shù)據(jù)庫,采用MVC 軟件設(shè)計(jì)模式的系統(tǒng)架構(gòu),Spring-boot 負(fù)責(zé)控制層Controller 的控制和轉(zhuǎn)發(fā),MyBatis 負(fù)責(zé)Model 層的模型映射,完成數(shù)據(jù)庫表和Java 類之間的映射關(guān)系,View 層采用微信小程序的頁面設(shè)計(jì)方案。
為方便每個(gè)商戶的信息查詢,統(tǒng)計(jì)每個(gè)商戶的信息,本系統(tǒng)中多商戶的系統(tǒng)設(shè)計(jì)是采用分庫的做法,也就是每個(gè)商戶對應(yīng)一個(gè)完整的數(shù)據(jù)庫,每個(gè)數(shù)據(jù)庫的表結(jié)構(gòu)完全一樣,這樣在連接數(shù)據(jù)庫查詢的時(shí)候不需要從大量的商戶中進(jìn)行刷選,提高查詢效率。
數(shù)據(jù)庫的設(shè)計(jì)語句如下:
drop database if exists mall;
drop user if exists 'mall'@'%';
create database mall default character set utf8mb4 collate utf8mb4_unicode_ci;
use mall;
create user 'mall'@'%' identified by 'mall123456';
grant all privileges on mall.* to 'mall'@'%';
flush privileges;
數(shù)據(jù)表都是采用單表設(shè)計(jì),數(shù)據(jù)表之間沒有一對一,一對多的映射關(guān)系,這樣做數(shù)據(jù)之間可能存在一定的冗余,但是查詢效率是最高的,例如,用戶表和用戶反饋表之間都包含用戶名稱、手機(jī)號碼等個(gè)人信息的冗余,沒有采用信息關(guān)聯(lián)的設(shè)計(jì)方法。
由于每個(gè)數(shù)據(jù)庫都是同樣的表結(jié)構(gòu),spring-boot 的接口都是采用統(tǒng)一的設(shè)計(jì),當(dāng)客戶端的商家提供的服務(wù)被自己的客戶點(diǎn)擊,發(fā)送請求到服務(wù)器進(jìn)行處理的時(shí)候,并不能區(qū)分每個(gè)接口的請求是來自哪個(gè)商戶的客戶,這一問題成為本文研究的核心問題。
在spring 的數(shù)據(jù)源的連接中,連接的信息如下,每一個(gè)商戶對應(yīng)一個(gè)數(shù)據(jù)庫:
基本原理是,我們在配置文件定義多個(gè)數(shù)據(jù)源,利用注解進(jìn)行配置數(shù)據(jù)源,然后用攔截器你判斷連接的是哪個(gè)數(shù)據(jù)源。
(1) 從線程共享變量中獲取key,返回正確的數(shù)據(jù)源
(2) 定義工具類,用于動(dòng)態(tài)切換數(shù)據(jù)源
(3) 利用注解配置數(shù)據(jù)源的連接
(4) 定義攔截器進(jìn)行判斷連接的是哪個(gè)數(shù)據(jù)源
系統(tǒng)實(shí)現(xiàn)互斥鎖的方案比較完整,也非常易于實(shí)現(xiàn),在訪問上保證了數(shù)據(jù)的訪問準(zhǔn)確和安全,具有一定推廣價(jià)值。