
mybatis是警察
druid是武器库(有很多q)
jdbc是武器商(他们造q给武器库)
当你需要一次"除暴安良"时,你需要去找警察,警察从武器库拿q干活
以往的开发,是你使用jdbc直接造q,然后自己干活
jdbc整合了:加载数据库驱动,创建连接,写原生语句,执行,关闭这些东西
而mybatis是对jdbc的封装,他允许你通过配置的形式,配置数据库参数,并且允许你通过xml来写动态sql语句<if:test>让你可以把sql变得灵活起来并且还能将你的查询结果直接映射到你想要的实体上面
然后你就去配置你的用户名,密码,连接超时,等等
等你下次使用mybatis时,他后面会根据你的配置,帮你加载数据库驱动,创建连接,写原生语句,执行,关闭
但是mybatis发现,在你每次访问都要重新创建创建连接,写,关很麻烦,所以mybatis说,我可以接受你再配置一个连接池,比如druid
mybatis让你指定连接池是谁,如druid之后将原来自己需要搞的东西都交给druid什么账号了,密码了都给他,让druid帮你创建一批连接,在你需要用的时候,mybatis从druid里面拿一个就行
下面是一次简单的访问流程:
controller->service->dao->mapper
1首先项目启动时druid就已经使用jdbc创建好一堆连接了,留待后用
2当请求到mapper时,mybatis框架创建临时类
3然后将动态sql进行替换重写,变成原始的native sql
4从druid拿到一个连接
5将sql通过连接交给数据库执行
6然后获取执行结果
7mybatis进行将结果进行映射,返回数据
说的有点乱,希望能说清楚吧
1、背景及环境
这几天在捣鼓Struts2+Spring3+Hibernate4+Maven+EasyUI的整合,JDK17,数据库采用Oracle 11g R2,驱动采用ojdbc14,数据库连接池采用阿里巴巴的druid(完整的包名为comalibabadruidpoolDruidDataSource),但是在做用JUnit做单元测试的时候报如下错误:
Caused by: javasqlSQLException: not support oracle driver 10
2、网友问答
网上搜了很久,发现最初发表在开源中国上的一篇被转载多次的问答:
问:今天第一次使用druid,程序启动的时候报“druid –not support oracle driver 10”,换个各种版本驱动(包括ojdbc6),都不行。是因为连接的客户端的版本太低了吗?
答:温少说的对,是因为有多个驱动包造成的。在jre的ext目录下发现了class12jar。
3、本文方法
我检查了下,发现我的问题并不是这个原因造成的,不过这篇文章给了我点启示,就是数据库驱动的版本问题,后来换用Oracle 11g自带的驱动ojdbc6jar,问题得到解决。
4、本文相关链接
①druid介绍:阿里巴巴数据库连接池druid
②Maven下如何安装ojdbc6jar:MyEclipse环境下如何采用Maven导入ojdbc14jar和ojdbc6jar
③Oracle数据库驱动版本变迁:Oracle数据库驱动历代版本及其区别(classes12,ojdbc14,ojdbc5,ojdbc6等)
//---------------------------------------------------------------------------------------------------------------------------------------------------------
>
MySqlStatementParser parser = new MySqlStatementParser(sql);
SQLStatement statement = parserparseStatement();
MySqlInsertStatement insert = (MySqlInsertStatement)statement;
然后使用解析得到的 insert ,就可以获得原始insert语句的各个部分:
List<SQLExpr> columns = insertgetColumns(); // 获得所有列名
insertgetQuery(); // 如果是 insert into select 语句,则可以获取 select查询
如果是批量插入的insert:insert into tab(id,name) values(1,'a'),(2,'b'),(3,'c');
则可以使用:
List<ValuesClause> vcl = insertgetValuesList();
获得素有的 values 子句部分。
非批量插入,则可以使用:
List<SQLExpr> valuse = insertgetValues()getValues();
获得 values 子句。
on duplicate 部分可以使用下面的语句获取:
List<SQLExpr> dku = insertgetDuplicateKeyUpdate();
获得了这些,就而已重组得到原始SQL语句,并且对其进行各种改写。
druid api这么说:
我们不是搜索领域的专家,如果我们的描述不正确,请发邮件或者通过其他方式告知。
es 是一个基于apache lucene 的搜索引擎。它提供了针对scheme-free 文档的全文搜索,提供看了对原始事件数据的访问。eses逐渐的增加了更多对于Fenix和聚合的支持。一些社区的成员指出:
es相比druid,在数据的获取和聚合方面需要的资源更多。
另外 es 在数据获取阶段不支持数据的汇总和汇聚,汇总和汇聚压缩数据。这就导致了es 需要更大的存储。
druid 致力于OLAP 工作流。druid 在低成本的基础上为了高性能(快速的聚合和数据获取)做了优化,而且支持更多的分析 *** 作。对于结构化的事件数据,druid 也有一些基础的搜索的支持,但是不支持全文的搜索。druid 也不支持完全的非结构化的数据。查询的维度必须在drudi的schema中进行定义,比如 汇总和roll-up 的实现。
苏宁八大产业,每个产业有自己的数据集市,每个数据集市有自己的维度表,没有统一的维度管理(包括管理规范和系统支撑)。业务痛点包含以下几个方面:
建立统一的维度管理系统,实现对维度信息的统一管控,并为集团的数据产品提供统一的维度数据服务,包含维度开发管理,维度信息管理及维度数据服务三个方面。
维度数据
如上图所示,ETL将采集的数据,进行数据清洗之后存储到维度数据仓库(磐石)中,维度系统再将维度数据仓库中的数据同步达到维度库系统。
维度数据存储方式:维度数据一般以一百万的数据量作为分割点,一百万以上数据量的维度采用的存储是HBASE,一百万以下的数据采用的存储是MYSQL。
维度数据同步方式:存储到HBASE的维度数据采用的是BULKLOAD导入,存储到MYSQL的维度数据采用的是SPARKSQL+RDD写入。针对数据同步都已经实现通过页面配置任务的方式一键同步,节省人工。
为什么采用这种存储方式?
1, 针对数据量的大小采用不同的存储引擎,节约存储资源,提高维度服务的稳定性。
2, 实时指标的计算:OALP需要关联维度表和事实表做指标数据加速(实时计算指标数据)。这种需要实时的查询维度表的所有维度属性,调用量非常庞大,所以采用了直接查询HBASE的方式。
3, 维度需要提供基于维度值ID查询维度值名称的服务(包括批量精确查询和模糊查询),HBASE在精确查询上性能较高。MYSQL由于数据量不大,可以再加一层分布式缓存,提高精确查询维度值的性能。
维度建模
1, 选择业务过程
根据业务场景以及可用数据源
2, 声明粒度
根据事实表及应用场景,确定汇总粒度,一般尽可能的用最细粒度
3, 确定维度
根据确定的粒度,定义对应的维度,最细粒度,也是最低层次的维度
4, 确定事实
确认将哪些事实放到事实表中,维度表只是做关联,不做维度数据的查询服务。
维度定义
1 当增加新的维度时,编码号将在已用号码的基础上递增,四位十进制编码号不能满足需求时,可增加编码号长度为五位十进制数,以此类推。
2 当删除已有的维度时,其编码号将不再利用。
3 当修改已有的维度时,其编码号不变。
4 当拆分已有的维度或合并两个及两个以上的维度时(数据应用场景需要),其编码号的使用原则按照删除原维度,并新增拆分/合并后的维度执行。
维度管理
维度:目前维度平台支持快速定义维度,通过设置维度的基本信息,选择维度映射的维度表,做好维度与维度表的映射,设定维度的一些特性(布尔维度,时间维度,杂项维度等),检测维度的定义结果。达到了让业务人员能够只是通过页面 *** 作就可以制定需要的维度。
维度表:数据开发人员可以通过维度库平台定义维度表,定义好之后可以集成数据仓库的同步任务一键将仓库的数据同步到维度表中,将维度表与维度做映射关系。
维度层级:维度库平台支持定义维度层级,只要是维度库平台上有的维度表并且做好维度与维度的映射关系之后,就可以定义需要的维度层级,根据维度层级提供维度值的上卷下钻查询服务。
维度血缘:提供了维度,指标,报表的血缘关系,以及还准备做的维度数据的血缘,维度,指标,报表调用次数的血缘等等。
维度服务
1 维度服务调用申请:
调用维度服务,需要在维度库管理系统中申请调用权限。等维度管理系统授权之后,生成维度服务调用授权码,在调用维度服务的时候带上维度服务调用授权码,维度服务会根据授权码判定是否有访问权限。
2 维度系统提供的服务:
1,对存储在HBASE的维度表,我们又加了一层存储到ELASTICSEARCH(提供维度值的模糊查询服务)
2,针对负载较高的HBASE表,加了一层本地缓存,解决热点问题。
3,对存储在MYSQL的维度表,我们又加了一层存储到分布式缓存ZEDIS(提供维度值精确查询服务)。提供了定时或者手动刷新缓存数据的功能,以及缓存数据的监控机制。
监控分析
由于维度服务的调用量是亿万级别的,系统的监控统计,采用的是Log4j+kafka+druid的架构,如下图所示,应用将调用日志采用log4j- KafkaLog4jAppender写入kafka中,再将kafka与druid集成,准实时的输入druid中,业务基于druid做统计分析,查看维度服务调用成功或失败的情况。
除了维度服务的调用监控,平台还有针对维度值的数据量监控(主要监控暴增或者突然没有维度数据的情况),维度值数据质量的监控(根据维度表和事实表做数据比对,分析维度值数据的差异情况)。维度数据同步任务的监控(每个维度表的数据同步情况监控,异常告警到具体的任务负责人)。通过各种有效的监控手段,来提升维度服务的稳定性和准确性。
1 未来平台会更加的完善,会有越来越多的维度在平台上建设,提供更加稳定和高效的维度查询服务。
2 能够支持更多个性化的维度,能够支持维度的数据版本(例如过去一段时间的维度值),支撑全集团所有数据产品的维度调用服务,将平台打造成苏宁主数据服务的航空母舰。
3 通过维度数据资产体系的建立,实现集团一切业务数据化,连接打通数据孤岛,驱动一切数据业务化,助力企业数字化转型,让数据做到真正意义上的产生价值。
4 通过提供各种维度数据支持数据产品及各类应用产品,帮助各岗位用户在日常经营决策中做出正确决策。
目前平台的现状及以后的规划
1, 完善系统监控功能点:缓存任务较多,没有有效的监控,告警机制。
2, 完善业务监控功能点:数据量监控,数据异常监控,告警功能
3, 落地维度新增、变更、下线全流程审核管理功能
4, 完善应用层的维度、指标、报表数据链路的血缘分析图谱,全方位透析资产,
5, 打通全链路维度变更通知的消息机制,降低数据链路变更带来的风险,
6, 多系统用户资源隔离、限流,保障多个部门在使用和体验上的一致性,
7, 支持用户自定义维度、完善个人工作台,基于通用维度进行维度的衍生,
8, 维度门户的建设,将业务端和管理端进行隔离,提升用户体验
画外音:目前Druid在开源中国举办的2019年度最受欢迎中国开源软件中排名第7名,支持Druid的朋友可以去投票哇。 2019年度最受欢迎中国开源软件
maxWait :从连接池中获取连接的最大等待时间,单位ms,默认-1,即会一直等待下去
笔者在使用Druid时都会设置这个参数,这样如果是获取连接超时,更容易从日志中获取调用失败的原因。
如果超时,Druid会抛出以下异常
在DruidDataSource中的getConnectionInternal方法使用到了maxWait
maxWait默认是不超时,即如果连接池没有空闲连接,则会一直等待下去,但是一般的接口都是有超时时间的,如果接口超时,不方便定位出来是获取不到连接导致的,最好设置maxWait,并且小于接口的超时时间。
Java单体项目里,我们一般是只需配置一个数据库,这时代码里的dao层都是只对一个数据库 *** 作;但有时候我们的数据可能在2个或者3个数据库,这时就需要配置更多数据源,进行数据库直连 *** 作,下面以MySQL的两个库为例(Oracle也就换个驱动类与连接串)。
(本文阅读大概花费两分钟)
技术条件:
springboot 253 (即springframework 539)
MySQL 57
mybatis-plus 350
dynamic-datasource 350
druid 129
idea开发工具、maven 339
1、导入相关依赖
2、建立两个数据库mydb(表 user)、db2(表t_class),并分别建一张表
3、编写applicationyaml配置文件
4、编写po类、dao层、一个接口测试类
其中,在dao的类加上对应的数据源标识符,使用此注解combaomidoudynamicdatasourceannotationDS
5、启动项目,查看结果
至此,多数据源环境集成成功;当然这里只使用了查询功能,对应事务相关的下一回合文章再做讨论啥。
以上就是关于mybatis+druid+jdbc 原理介绍全部的内容,包括:mybatis+druid+jdbc 原理介绍、如何给myeclipse的maven配置druid、druid 和my sql 的区别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)