关于 多个sql连接、如何避免多层传递上下文 或者 db呢?
来源:5-9 商品repository开发---查询所有记录
lairifangchang
2019-06-13
嗨 你好 cap老师 !
最近开发了一个新项目 面向B端的、 因为是每个API接口、调用者可能都不是同一个用户、
流程是这样的:
1. 请求一进来、 取出上下文中的 Header 中的某个字段、 根据这个字段去缓存中查找这个用户 对应的DB、 如果没有则创建DB 加入缓存中、
2. 每个接口都可能导致是不通的用户、 从而访问不通的DB、这样一来 我需要把数据库引擎 一级一级的传递到数据库访问层、才能够使用、
3. 那如何简化这个问题呢?
1回答
-
同学你好,
根据同学的描述,cap老师做了个业务抽象,理解为以下场景:
业务场景:“一个接口,会有多个user访问,每个user会对应不同的DB”
实现目标:现在要解决的是不想每次传递DB句柄(让接口更面向业务),从而达到像操纵单个数据一样的写DB(更优雅简便);
针对以上场景和需求可以做如下架构抽象和优化:
第一种:合并DB分表查询
每个用户对应的数据库合并为同一个数据库,原有对应的不同数据库改为不同数据表,采用用户ID(或者其它唯一标示)+表名称的方式区分(达到之前类似分库的目的);
之后在查询数据的时候,只要在数据库访问的sql上根据“用户ID+表名”的方式得出表名查询即可;
以上 DB无来回切换传递,数据库访问层容易改动,且改动量少,代价小。优雅的实现了代码抽象和架构抽象;
第二中:包装接口(如果无法合并DB)
需要操做数据库必须要有数据库连接,但是这个连接可以先不创建,用到再创建,具体做法可以如下:
1.应用层面获取好数据库连接信息(可以放到特定的结构体中);
2.修改数据库访问层代码,在model结构体中,添加数据库连接信息结构体,
3.在每次操纵操纵数据之前读取动态的数据库连接信息获取想要DB句柄,操纵数据库;
这种种做法无须修改查询sql,把DB创建延后,让DB操纵更加抽象;
以上是老师根据理解给出的技术架构层面的抽象和优化,希望能够帮到同学。
312020-11-03
相似问题
回答 3
回答 1