关于一个系统应用是否使用多个数据源(连接池)的探讨

简介: 问:为什么一个应用需要多个数据源 答:有些情况下就是有多个数据源的 问:如果有这样的系统耦合太大了 答:比如一个查询应用,可能从不同数据库服务器的数据库中查询数据,这样就会在poolman.xml中配置多个数据源,不能说使用了多个数据源,系统的耦合度就增加了,两者不是一回事。
:为什么一个应用需要多个数据源
:有些情况下就是有多个数据源的

:如果有这样的系统耦合太大了
:比如一个查询应用,可能从不同数据库服务器的数据库中查询数据,这样就会在 poolman.xml中配置多个数据源,不能说使用了多个数据源,系统的耦合度就增加了,两者不是一回事。

:如果这样设计就很糟糕
:并不是所有的应用都需要多个数据源,但是有些应用确实有这种情况,实际要求是这样的不能说这种设计就是糟糕的设计。

:查询系统应该只有select 表的权限,很明显这样应该建一个cdc数据库用户 其他用户表的权限只授予select 给cdc 用户,不应该将给dbname 权限 这样的安全有问题
:查询系统的账号有可能有查询权限,也有可能有其他权限,这个东西视情况而定,比如在数据交换系统中,通常不会使用生产系统的数据库用户来做数据交换,通常会另外创建只有查询权限的用户,但是没有绝对的情况。

:如果dbname 连表的owner用户 表的什么权限都有了
:当然我只是那查询做个例子来说明多个数据源的情况

:一般应用连dbname 不应该 是表的owner,一般的公司都dbname 都连表的owner 实际上安全有很大问题;一个dbname 难道不就是一个用户吗
;虽然 不是oracle 用户,但是dbname 和oracle 一般也是一一对应的

:dbname只是bboss持久层框架中的逻辑数据源的名字,不是oracle的用户名称,也就是poolman.xml中配置的<dbname>节点的值,两者完全是两个不同的概念。
是否使用多个数据源,是系统数据库规划问题,规划能使用几个数据库源就能使用,不能就不使用,bboss持久层提供了两套api分别对应于这两种情况。

一个dbname的定义如下,oracle定义:

img_0ad7e2c1783ca97a347cf81a96c64a46.jpe

这个是mysql的数据源定义:

img_9c47a7bd2144a4c0239fe6b8de5e4ebc.jpe

这个是derby数据源

img_e86d3c03fdd477c7780a034d79e10816.jpe

:有这样情况?
答:呵呵,数据源(也就是我们通常意义上的连接池)通常都有一个dbname这个是bboss持久层框架的要求,有的数据源会对应数据库用户,有的数据源不对应数据库用户,比如derby

而且一个应用可能会操作多种数据库,比如mysql,oracle,db2,sqlserver,还有derby,等等,呵呵

:一个应用可能同时会操作多种数据库

这耦合太大了

:呵呵,那么,bboss持久层api的就提供了两组接口,一组是带dbname的,一组是不带的,如果一个系统中只有一个数据源,那么poolman.xml中就只配置一个数据源,反之就可以配置多个,使用不带dbname的api时,默认对应poolman.xml中的第一个数据源,使用带dbname的api时,那么就在对应的数据源上执行数据库操作。

在业务系统中可能操作多个数据源的情况是普遍存在的,这个和松耦合高内聚的软件设计思想没有必然联系的,也就是说这个和松耦合高内聚的软件设计思想没有冲突的

另外一种情况,我们在一个系统中有几个大模块,为了能够方便的解耦拆分和缓解一个数据库的大压力,我们反而会引入每个模块一个数据源,每个数据源对应一个独立的数据库服务器,当然前提是每个独立的模块之间的数据库是没有关联的,呵呵

当然,如果系统规模比较大,我们会将这些系统拆分成独立的应用部署,每个应用还是可以只配自己的对应的dbname的数据源即可,这样非常方便拆分和合并应用模块的,呵呵

:别把系统搞成巨无霸系统了
:那确实,不过一般情况下用不用多数据源和系统规模没有太多关系的。用多个数据源的系统不一定是大系统哦,很多小系统也有多个数据源的哦。

另外再大系统中使用多数据源,可以为访问量较大的模块分配一个独立的数据源,为访问量较小的模块分配其他的数据源,也能够使系统的性能更好。

bboss的持久层框架api尽可能地满足各种需要,至于系统怎么去使用,可以有架构师去决定,呵呵

bboss持久层相关配置文章:
持久层动态创建、启动、停止和使用多个数据源的方法

bbossgroups实现多数据库事务

bboss persistent通过jndi引用外部数据源(datasource)方法


bbossgroups持久层框架ConfigSQLExecutor组件api实例

bbossgroups 3.1SQLExecutor组件api使用实例 

bbossgroups持久层框架数据源配置文件实例
目录
相关文章
|
SQL Oracle 关系型数据库
浅谈mysql数据库迁移至国产化达梦数据库
项目要求mysql数据库数据需要转到达梦数据库,对于达梦数据库的了解尚且不多,一开始使用手动转SQL脚本,效率极低,非常容易出错。达梦数据库的资料实在有限,经过后期研究,发现原来DM已经有自己的数据迁移工具,使用之后非常方便。对mysql数据库转达梦数据库的操作流程做一个简要分享。
6766 0
浅谈mysql数据库迁移至国产化达梦数据库
|
存储 缓存 负载均衡
Tair分布式缓存
Redis很好用,相比memcached多了很多数据结构,支持持久化。但是在很长一段时间里,原生是不支持分布式的。后来就出现了很多redis集群类产品,Tair是其中胜出的优秀作品之一。 所以Tair的特性都是一些集群的特性,比如:容错、解决单点故障、跨机房管理、多集群管理、支持副本等。总而言之,是redis的高可用版本。
2048 1
Tair分布式缓存
|
存储 SQL 关系型数据库
MySQL 大表拆分
【9月更文挑战第13天】在 MySQL 中,为解决大数据量导致的性能问题,常采用表拆分策略,主要包括水平拆分和垂直拆分。水平拆分按规则将大表拆成多个小表,如范围划分(按时间或 ID)和哈希划分(按字段哈希值)。垂直拆分则按字段相关性拆分,减少表宽度。拆分需注意数据迁移、应用改造、索引优化及分布式事务处理等问题。实施前应充分评估和测试。
1085 8
|
Java Maven
idea中maven项目pom文件Could not acquire lock(s)
idea中maven项目pom文件Could not acquire lock(s)
8096 2
|
11月前
|
前端开发 搜索推荐 安全
你用过最好的CMS网站管理系统?
本文主要介绍了内容管理系统(CMS)的概念、功能和使用场景。CMS是一种位于WEB前端和后端管理前端内容的软件系统,用于发布、修改、审批、发布内容。文章提到,内容管理系统在满足个性化需求和提高工作效率方面有显著优势。
1194 1
|
存储 SQL NoSQL
mybatis-plus小技能: 分表策略(按年分表和按月分表)
业务场景: 日志、交易流水表或者其他数据量大的表,通过日期进行了水平分表,需要通过日期参数,动态的查询数据。 实现思路:利用MybatisPlus的动态表名插件DynamicTableNameInnerInterceptor ,实现Sql执行时,动态的修改表名。
8864 3
mybatis-plus小技能: 分表策略(按年分表和按月分表)
|
网络协议 网络安全 数据库
|
Dart JavaScript 前端开发
npm install node-sass 安装失败的解决方案:利用国内镜像加速安装
npm install node-sass 安装失败的解决方案:利用国内镜像加速安装
6883 1
|
算法 Nacos
Nacos遇到的无法下线问题,caused: errCode: 500, errMsg: do metadata operation failed ;caused: com.alibaba.naco
Nacos遇到的无法下线问题,caused: errCode: 500, errMsg: do metadata operation failed ;caused: com.alibaba.naco
|
Web App开发 人工智能 Ubuntu
【Linux】Linux启动/查看/结束进程命令(详细讲解)
【Linux】Linux启动/查看/结束进程命令(详细讲解)