多商户系统多个数据库的访问设计和实现
2020-06-23汪卫兵广东邮电职业技术学院人工智能技术服务专业负责人
汪卫兵 广东邮电职业技术学院 人工智能技术服务专业负责人
1 研究内容及意义
本文研究的是B2B2C 系统,B2B2C 是一种电子商务类型的网络购物商业模式,为传统企业和大中型网商打造以提高商家运营能力为核心,提供的电子商务平台。针对多商户系统中用户访问多个系统数据库的接口并发问题,提供了一种多商户系统中多个商户如何对应自己的数据库的解决方案,该方案可以作为一种实际可行的解决方案,应用到实际的多商户系统,并具有推广价值。
2 系统的数据库访问核心技术
2.1 MySQL 技术
MySQL 是一种关系型数据库,它是一种C/S 模型(即客户端和服务端模型),客户端通过账号、密码来连接服务器,连接成功之后才可以进行数据库的操作(CRUD:增加、删除、变更、查询)。本系统采用MySQL 关系数据库。
2.2 Java web 技术
Spring-boot 是一种基于Java 的MVC 框架,Spring-boot 提供了一种快速构建应用程序的方法。作为本web系统的核心技术框架,完成用户与服务器之间B/S 的交互,实现对数据库的访问。
2.3 MyBatis 技术
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java 对象)映射成数据库中的记录。
3 多商户商城系统数据库的设计与实现
3.1 多商户系统的总体设计
本文基于比较成熟的Java web 框架Spring-boot 和MyBatis进行系统设计,数据库采用 MySQL 关系数据库,采用MVC 软件设计模式的系统架构,Spring-boot 负责控制层Controller 的控制和转发,MyBatis 负责Model 层的模型映射,完成数据库表和Java 类之间的映射关系,View 层采用微信小程序的页面设计方案。
3.2 多商城数据库的设计
为方便每个商户的信息查询,统计每个商户的信息,本系统中多商户的系统设计是采用分库的做法,也就是每个商户对应一个完整的数据库,每个数据库的表结构完全一样,这样在连接数据库查询的时候不需要从大量的商户中进行刷选,提高查询效率。
数据库的设计语句如下:
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;
数据表都是采用单表设计,数据表之间没有一对一,一对多的映射关系,这样做数据之间可能存在一定的冗余,但是查询效率是最高的,例如,用户表和用户反馈表之间都包含用户名称、手机号码等个人信息的冗余,没有采用信息关联的设计方法。
3.3 多个数据库的访问
由于每个数据库都是同样的表结构,spring-boot 的接口都是采用统一的设计,当客户端的商家提供的服务被自己的客户点击,发送请求到服务器进行处理的时候,并不能区分每个接口的请求是来自哪个商户的客户,这一问题成为本文研究的核心问题。
在spring 的数据源的连接中,连接的信息如下,每一个商户对应一个数据库:
3.4 互斥锁技术和Java 多线程互斥锁的实现
基本原理是,我们在配置文件定义多个数据源,利用注解进行配置数据源,然后用拦截器你判断连接的是哪个数据源。
(1) 从线程共享变量中获取key,返回正确的数据源
(2) 定义工具类,用于动态切换数据源
(3) 利用注解配置数据源的连接
(4) 定义拦截器进行判断连接的是哪个数据源
4 总结与展望
系统实现互斥锁的方案比较完整,也非常易于实现,在访问上保证了数据的访问准确和安全,具有一定推广价值。