由于微服务技术发展迅猛,在我们的架构中,每个微服务都会相应的对接一个数据库,各个数据库之间有关联的表(比如用户表、业务表等)会互相同步数据,其他的数据操作各自独立(如日志表、操作表等),这么设计是基于性能考虑降低数据库容量及尽最大努力避免性能遭遇瓶颈。这么设计对于container来说确实是极友好的,在日常运维中,比如每月/季度的数据汇总就难受了,身为DBA,处理跨表查询应该是小case,然而在hibernate跨表查询中,虽然麻烦但还是啃一下还是可以解决的。然而最近接到的需求却是要,跨!库!联!查!

我在想微服务的背景下,跨库查询应该是新常态

单库时,系统中很多列表和详情页所需数据可以简单通过SQL join关联表查询;然而多库情况下,数据可能分布在不同的节点/实例上,不能跨库使用join,此时join带来的问题就很棘手了。

我们在开发过程中,连接数据库一个连接也是只能连一个数据库这个是常规操作,例如

db1 = pymysql.connect("11.22.33.44", "yerik", "mimajiubiekanla", "shujukuming1", port=3306)

如果我们要查询另一个数据库呢?不就要,再建立一个连接嘛

db2 = pymysql.connect("55.66.77.88", "yerik", "mimajiubiekanla", "shujukuming2", port=3306)

这个怎么可能用join操作,可能有读者想要杠一下,说,可以通过xx操作在代码层面进行开发,但是,这样的代码可读性有多强?另外就代码审查来说,也不会让你这么写,万一某一天你甩锅离职了,这天花乱坠的代码,谁受得了?

不过嘛,办法总比困难多的——视图。利用视图,我们可以非常简单的实现这样的跨库查询的需求。我们知道所谓视图,其实就是存储的查询语句,当调用的时候,产生结果集,视图充当的是虚拟表的角色。因此:

如果要对一张表或者多张表进行查询,可以通过写复杂的SQL语句来实现

如果要这些SQL语句存储为视图,那么查询的时候,就直接查询这个视图就可以了

一开始我也是被我这个想法惊讶到了,总觉得跨库建视图太过于惊悚了,毕竟实践是检验真理的唯一标准嘛,随手就在navicat上面建立一个视图,之后运行

非常神奇~~那问题这样就解决啦,还是一条SQL语句就可以解决问题了

通过这个思路,其实可以继续推广:跨表联查,建个视图,跨库联查,建个视图。建就完事了。另外这个操作其实还需要考虑数据同步的问题,因为是多库联查,如果数据不一致会是灾难的,这个具体问题要具体分析,加锁或者配置同步策略这些都是常规方案,由于我没有这个需求,就不展开讨论啦。

这个案例对我来说很有感触

所谓运维开发,就是在运维过程中提供开发思路,原先一味的代码开发,遇到这样的多库查询简直想要与原地爆炸,借助这个思路,多库查询就变成了单表查询

我们的架构基于jhipster进行开发,要对数据库操作需要通过jpa调用hibernate。这个是常规思路,但是为了敏捷开发,一个web服务,我使用django进行开发,直接一条sql就完事了,查询结果通过整理在一份csv文件中,通过邮件发送给用户

敏捷开发也不过如此吧,这个小插件的开发,从需求确认到服务上线也就4个钟,但是由于简洁,一直服务着,也没发生啥故障,也给运维省了工作量

微服务跨数据库联合查询_数据库跨库查询相关推荐

  1. 微服务架构下,大型银行数据库应用实践

    如今,大型企业的应用平台正在向微服务架构进行转型.在微服务架构下,应用程序和数据库等底层平台的关系将会被重构. 作为新一代分布式数据库,其架构与功能特性需要保证在与传统数据库全兼容的基础上,拥抱微服务 ...

  2. 使用python对学生表的查询_多表组合查询——Python操作Mysql数据库

    前面我们介绍了单张表的查询,包括模糊查询.分组.排序.各种筛选条件等等操作,在实际应用中,查询的数据往往不止局限在一张表里,通常需要多张表在一起进行组合查询,今天我们将会对Mysql当中的多张有关联的 ...

  3. mysql select符合查询_数据库select group by 和having语句 多表连接查询 复合查询

    1.SELECT --group by 子句 group by子句按照指定的列column_name对表数据进行分组 group by 后面跟的列也叫分组特性列 使用group by后,能选择的列   ...

  4. mysql连接与嵌套查询_数据库之嵌套查询与连接查询

    嵌套查询 单值嵌套查询 值返回结果是一个值的嵌套查询称为单值嵌套查询 对Sales数据库,列出市场部的所有员工的编号 USE Sale GO SELECT employee_id FROM emplo ...

  5. mysql做十亿条数据查询_数据库优化:mysql数据库单机数十亿数据查询设计

    很久没写文章,是不是想着写点什么东西,分享下我的数据库设计思路,主要是针对单机数十亿及以上数据查询优化技巧. 如果只是简单的查询,没有频繁的写入操作,对查询速度不要求在毫秒级别,就不需要什么大型的数据 ...

  6. java查询数据库大批量数据_数据库有百万数据量的情况下,分页查询的方法及其优化方式...

    当需要从数据库查询的表有上万条记录的时候,一次性查询所有结果会变得很慢,特别是随着数据量的增加特别明显,这时需要使用分页查询.对于数据库分页查询,也有很多种方法和优化的点. 下面简单说一下我知道的一些 ...

  7. mybatis 游标查询_数据库游标(示例代码)

    游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制.游标充当指针的作用.尽管游标能遍历结果中的所有行,但他一次只指向一行. 概括来讲,SQL的游标是一种临时的数据库对象,即可以用来存 ...

  8. mysql 查询数据库索引语句_利用SQL语句查询数据库中所有索引

    本章我们就要讲解一下如何利用sql语句来查询出数据库中所有索引明细.当然了,我们可以在microsoft sql server management studio中选择"表"- & ...

  9. mysql数据库实验查询_数据库表的查询操作(实验二)

    [实验目的]:了解SQL语言的使用,进一步理解关系运算,巩固数据库的基础知识. [实验要求]:掌握利用Select语句进行各种查询操作:单表查询.多表连接及查询.嵌套查询.集合查询等. [实验内容] ...

最新文章

  1. JavaScript新知:sessionStorage and localStorage
  2. CSDN粉丝可见回来了!
  3. cognos10 安装部署
  4. C51指针定义和应用小结
  5. Android JNI学习(四)——JNI的常用方法的API
  6. java面相对象的关键字_Java面向对象关键字有哪些?
  7. 父组件和子组件同是使用 beforeDestroy 钩子 保存同一份数据
  8. MySQL--Centos7下安装5.7.19
  9. Visio_Premium_project_vol版
  10. 3DMAX哪个版本最稳定?3DMAX哪个版本最好用?
  11. C# 读取TXT文本文档 搜索指定字符串所在的行 保存到集合
  12. 当前版本与卡刷包android_安卓7.0 xposed框架卡刷包
  13. 腾讯云网站域名备案帮助说明文档
  14. ES6模板字符串中使用循环并取值
  15. 计算机二级msoffice操作题如何评分,计算机二级MSOffice操作题及答案解析
  16. Vector、Sort课后题解
  17. github分支操作
  18. Django实现adminx后台识别用户身份的内容编辑与显示
  19. 聚焦手机操作系统 运营商的“门户”之战
  20. 如果redis没有设置expire,是否默认永不过期?

热门文章

  1. LeetCode-147:对链表进行插入排序
  2. 经典神经网络 | Faster R-CNN论文解析
  3. 从零开始学Pytorch(十五)之数据增强
  4. Python ATM实战
  5. python程序设计搜题软件下载_智慧职教云课堂APPPython程序设计答案搜题公众号
  6. 5v继电器模块实物接线_电气工程师都收藏的西门子S71200PLC接线图设计大全
  7. 软件测试常见笔试面试题(二)
  8. php切割文件上传,php+ajax实现文件切割上传功能示例
  9. 标识响应式html,第一个html5+响应式页面
  10. 转list_quot;quot;转 Int,{} 转 List,还有什么奇葩的 JSON 要容错?| 实战