关于 多个sql连接、如何避免多层传递上下文 或者 db呢?

来源:5-9 商品repository开发---查询所有记录

lairifangchang

2019-06-13

嗨 你好 cap老师 !
最近开发了一个新项目 面向B端的、 因为是每个API接口、调用者可能都不是同一个用户、

流程是这样的:
1. 请求一进来、 取出上下文中的 Header 中的某个字段、 根据这个字段去缓存中查找这个用户 对应的DB、 如果没有则创建DB 加入缓存中、
2. 每个接口都可能导致是不通的用户、 从而访问不通的DB、这样一来 我需要把数据库引擎 一级一级的传递到数据库访问层、才能够使用、
3. 那如何简化这个问题呢?

写回答

1回答

Cap

2019-06-14

同学你好,

根据同学的描述,cap老师做了个业务抽象,理解为以下场景:

业务场景:“一个接口,会有多个user访问,每个user会对应不同的DB”

实现目标:现在要解决的是不想每次传递DB句柄(让接口更面向业务),从而达到像操纵单个数据一样的写DB(更优雅简便);

针对以上场景和需求可以做如下架构抽象和优化:

第一种:合并DB分表查询

  1. 每个用户对应的数据库合并为同一个数据库,原有对应的不同数据库改为不同数据表,采用用户ID(或者其它唯一标示)+表名称的方式区分(达到之前类似分库的目的);

  2. 之后在查询数据的时候,只要在数据库访问的sql上根据“用户ID+表名”的方式得出表名查询即可;

以上 DB无来回切换传递,数据库访问层容易改动,且改动量少,代价小。优雅的实现了代码抽象和架构抽象;

第二中:包装接口(如果无法合并DB)

    需要操做数据库必须要有数据库连接,但是这个连接可以先不创建,用到再创建,具体做法可以如下:

    1.应用层面获取好数据库连接信息(可以放到特定的结构体中);

    2.修改数据库访问层代码,在model结构体中,添加数据库连接信息结构体,

    3.在每次操纵操纵数据之前读取动态的数据库连接信息获取想要DB句柄,操纵数据库;

这种种做法无须修改查询sql,把DB创建延后,让DB操纵更加抽象;


以上是老师根据理解给出的技术架构层面的抽象和优化,希望能够帮到同学。

   

3
1
starxigua
cap老师牛掰
2020-11-03
共1条回复

全流程开发 GO实战电商网站高并发秒杀系统

运用架构设计与系统化思维,从容应对不同流量等级的“秒杀”场景

1462 学习 · 443 问题

查看课程