zebra源码分析-导读
- zebra源码分析-导读
- 客户端架构
- JDBC
- 核心部分介绍
- 代码流程
- 数据源
- Statement
- 参考
zebra源码分析-导读
zebra是一个基于JDBC
API协议上开发出的高可用、高性能的数据库访问层解决方案,提供动态配置,基于CAT的的完善监控,读写分离,分库分表等功能,向上支持JDBC以及MyBatis等。
另外本篇文章也是知识扫盲,整理一些关于JDBC应该知道的东西
客户端架构
zebra中主要包括实现了三个JDBC协议的数据源,分别是:
ShareDataSource
:共享数据源,负责分库分表的连接池,判断数据落在哪一个分片上,并将其转发给对应的数据源处理,会包含多个群组或单一数据源GroupDataSource
:群组数据源,负责读写分离的连接池,它主要负责判断SQL的读写操作,然后把相应的SQL发送给SingleDataSource,包含若干个SingleDataSourceSingleDataSource
:单一数据源,负责抽象底层的数据库连接池类型(c3p0,druid,tomcat-jdbc等),然后直连每一个数据库实例,对应着每一个Master或者Slave
JDBC
核心部分介绍
JDBC的API包括以下几个核心的部分
JDBC Drivers-驱动
是一个可以让你连接数据库的一个java类,它继承了很多个jdbc接口,当你用jdbc驱动的时候,它用标准的jdbc接口,所使用的具体JDBC驱动程序隐藏在JDBC接口后面
Connections-连接
一旦加载并初始化JDBC驱动程序,就需要连接到数据库。 您可以通过JDBC
API和加载的驱动程序获取与数据库的连接。
与数据库的所有通信都通过连接进行。
应用程序可以同时向数据库打开多个连接。
Statements-语句
Statement是用来对数据库执行语句。 可以使用几种不同类型的语句。
每条语句都对应一个增删改查。
ResultSets-结果
对数据库执行操作后,你会得到一个ResultSet。
然后可以遍历此ResultSet以读取操作的结果。
代码流程
若是直接使用JDBC代码访问数据库的流程一般都是加载数据库驱动,创建数据库连接对象,创建SQL连接语句,执行SQL语句并处理返回的结果。
public class JdbcTest {@Testpublic void testJdbc() {String url = "jdbc:mysql://localhost:3306/myblog?user=root&password=1234&useUnicode=true&characterEncoding=UTF8&useSSL=false";Connection conn = null;try {Class.forName("com.mysql.cj.jdbc.Driver");conn = DriverManager.getConnection(url);String author = "coolblog.xyz";String date = "2018.06.10";String sql = "SELECT id, title, author, content, create_time FROM article WHERE author = '" + author + "' AND create_time > '" + date + "'";Statement stmt = conn.createStatement();ResultSet rs = stmt.executeQuery(sql);List<Article> articles = new ArrayList<>(rs.getRow());while (rs.next()) {Article article = new Article();article.setId(rs.getInt("id"));article.setTitle(rs.getString("title"));article.setAuthor(rs.getString("author"));article.setContent(rs.getString("content"));article.setCreateTime(rs.getDate("create_time"));articles.add(article);}System.out.println("Query SQL ==> " + sql);System.out.println("Query Result: ");articles.forEach(System.out::println);} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();} finally {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}
数据源
是数据库以及对数据库交互操作的对象,封装了目标源的信息,以及建立个关闭连接的操作,相当于将原来连接数据库的耦合的代码抽象出一个借口,当需要更换数据库服务器或者连接的种类时,只需要修改配置信息即可,分类了不提供连接池和提供连接池两种类型
不提供连接池
数据源对于应用程序的每一个连接请求都建立新的连接,当应用程序使用完毕后,再执行销毁操作。当与数据库交互频繁时,这种模式会严重影响程序的性能。时间和空间消耗大多数消耗在连接和销毁中,而非数据库处理
提供连接池
连接池是一种创建和管理一组连接对象的技术,这些连接对象可供任何需要它的线程使用。连接池可以极大地提高Java应用程序的性能,避免了创建新的连接实例时所必需的初始化和认证时间,同时减少整体资源使用。当应用程序与数据库交互时,就可以快速从连接池中选择一个空闲的连接使用;当使用完毕,把该连接归还给连接池即可。
Statement
区别和联系
PreparedStatement 是一个特殊的Statement对象,有以下优点:
- 简化Statement中的操作
- 提高执行语句的性能
- 可读性和可维护性更好
- 安全性更好。
使用PreparedStatement能够预防SQL注入攻击,执行阶段只是把输入串作为数据处理,不再需要对SQL语句进行解析,防止select *
from user where name=‘aa’ and password=‘bb’ or
1=1的sql注入问题的发生。
和Statement之间的区别和联系如下:
- 关系:PreparedStatement继承自Statement,都是接口
- 区别:PreparedStatement可以使用占位符,是预编译的,批处理比Statement效率高
示例代码
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(url,user,password);
// 支持使用占位符
String sql = "update user set username=? where id = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,"Fant.J");
preparedStatement.setInt(2,27);//PreparedStatement复用
int result = preparedStatement.executeUpdate();
preparedStatement.setString(1,"Fant.J reUseTest");
preparedStatement.setInt(2,27);
preparedStatement.executeUpdate();
好处
- JDBC驱动程序可以在内部缓存PreparedStatement对象,从而重用PreparedStatement对象,不再需要创建对象
- 重用现有的PreparedStatement,可以为后续查询重用SQL解析和查询计划,数据库不再需要解析和创建查询计划
参考
Zebra总体设计
数据库访问层中间件Zebra
MyBatis源码分析系列文章导读
zebra源码分析-导读相关推荐
- Zebra源码分析-SingleDataSource
Zebra源码分析-SingleDataSource 1. 简介 1.1 层级结构 1.2 内部结构 2. 使用示例 2.1 直接使用JDBC 2.2 结合MyBatis以及Spring 3.源码分析 ...
- Zebra源码分析-GroupDataSource
Zebra源码分析-GroupDataSource 1 简介 GroupDataSource是读写分离数据源,由多个SingleDataSource组成,其中有一个主库,用于写操作和一部分指定得读操作 ...
- 【Spring】Spring AOP源码分析-导读(一)
文章目录 1.简介 2.AOP 原理 3.AOP 术语及相应的实现 3.1 连接点 - Joinpoint 3.2 切点 - Pointcut 3.3 通知 - Advice 3.4 切面 - Asp ...
- Spring AOP 源码分析 - 筛选合适的通知器
1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析.本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出 ...
- MyBatis 源码分析系列文章导读
1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...
- Spring IOC 容器源码分析系列文章导读
1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...
- Spring IOC 容器源码分析系列文章导读 1
1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...
- MyBatis 源码分析系列文章导读 1
1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...
- 《Ceph源码分析》——导读
本节书摘来自华章出版社<Ceph源码分析>一书中的导读,作者常涛,更多章节内容可以访问云栖社区"华章计算机"公众号查看 目 录 序言 第1章 Ceph整体架构 1.1 ...
最新文章
- 【转】找到 MySQL 数据库中的不良索引
- 你必须掌握的 21 个 Java 核心技术
- react 组件引用组件_React Elements VS React组件
- SVN提交时出现locked错误解决办法
- Postgres外部表示例
- DataTable分组
- 从0打卡leetcode之day 3 -- 最大子序列和
- 全球硬科技开发者大会(成都)开幕 蓝光发展等超300名开发者「乘风」数字升级...
- 同济大学计算机直博生条件,同济大学攻读博士学位研究生培养工作规定(2016年修订).doc...
- JDY-24M级蓝牙简介
- 国内App推广N种方法,总有几种适合你
- URP渲染管线实战教程系列 之URP渲染管线实战解密(一)
- 祖籍-山西省洪洞县大槐庄
- 设计模式学习(十七) 观察者模式 Observer
- 西门子plc S7-1200学习历程(1)
- P1282 多米诺骨牌
- I Want to Know
- 电视剧《奋斗》精彩对白节选---(七)
- 不改一行代码!快速迁移 Flask 应用上云
- flask使用Blueprint
热门文章
- 计算机在智能交通系统中应用,浅议计算机技术在现代智能交通系统中的应用
- linux 双线,linux 双线解决方案
- 怎样用c语言实现CPU超频,教你用最简单的方法给你的显卡超频
- 卸载windowsxp正版验证补丁
- 实现iconfont图标渐变
- 计蒜之道(阿里的新游戏)第一题 解题报告
- 安装 TeX 及其必要的依赖
- 《LoadRunner 12七天速成宝典》—第1章 1.5节安装LoadRunner 12.5
- 苏宁818战报幕后:“冬有双11,夏有818”如何形成
- 【Java】实现聊天程序(完整版)