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