• zebra源码分析-导读

    • 客户端架构
    • JDBC
      • 核心部分介绍
      • 代码流程
      • 数据源
      • Statement
    • 参考

zebra源码分析-导读

zebra是一个基于JDBC
API协议上开发出的高可用、高性能的数据库访问层解决方案,提供动态配置,基于CAT的的完善监控,读写分离,分库分表等功能,向上支持JDBC以及MyBatis等。

另外本篇文章也是知识扫盲,整理一些关于JDBC应该知道的东西

客户端架构

zebra中主要包括实现了三个JDBC协议的数据源,分别是:

  • ShareDataSource:共享数据源,负责分库分表的连接池,判断数据落在哪一个分片上,并将其转发给对应的数据源处理,会包含多个群组单一数据源
  • GroupDataSource:群组数据源,负责读写分离的连接池,它主要负责判断SQL的读写操作,然后把相应的SQL发送给SingleDataSource,包含若干个SingleDataSource
  • SingleDataSource:单一数据源,负责抽象底层的数据库连接池类型(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();

好处

  1. JDBC驱动程序可以在内部缓存PreparedStatement对象,从而重用PreparedStatement对象,不再需要创建对象
  2. 重用现有的PreparedStatement,可以为后续查询重用SQL解析和查询计划,数据库不再需要解析和创建查询计划

参考

Zebra总体设计

数据库访问层中间件Zebra

MyBatis源码分析系列文章导读

zebra源码分析-导读相关推荐

  1. Zebra源码分析-SingleDataSource

    Zebra源码分析-SingleDataSource 1. 简介 1.1 层级结构 1.2 内部结构 2. 使用示例 2.1 直接使用JDBC 2.2 结合MyBatis以及Spring 3.源码分析 ...

  2. Zebra源码分析-GroupDataSource

    Zebra源码分析-GroupDataSource 1 简介 GroupDataSource是读写分离数据源,由多个SingleDataSource组成,其中有一个主库,用于写操作和一部分指定得读操作 ...

  3. 【Spring】Spring AOP源码分析-导读(一)

    文章目录 1.简介 2.AOP 原理 3.AOP 术语及相应的实现 3.1 连接点 - Joinpoint 3.2 切点 - Pointcut 3.3 通知 - Advice 3.4 切面 - Asp ...

  4. Spring AOP 源码分析 - 筛选合适的通知器

    1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析.本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出 ...

  5. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  6. Spring IOC 容器源码分析系列文章导读

    1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...

  7. Spring IOC 容器源码分析系列文章导读 1

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  8. MyBatis 源码分析系列文章导读 1

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  9. 《Ceph源码分析》——导读

    本节书摘来自华章出版社<Ceph源码分析>一书中的导读,作者常涛,更多章节内容可以访问云栖社区"华章计算机"公众号查看 目 录 序言 第1章 Ceph整体架构 1.1 ...

最新文章

  1. 【转】找到 MySQL 数据库中的不良索引
  2. 你必须掌握的 21 个 Java 核心技术
  3. react 组件引用组件_React Elements VS React组件
  4. SVN提交时出现locked错误解决办法
  5. Postgres外部表示例
  6. DataTable分组
  7. 从0打卡leetcode之day 3 -- 最大子序列和
  8. 全球硬科技开发者大会(成都)开幕 蓝光发展等超300名开发者「乘风」数字升级...
  9. 同济大学计算机直博生条件,同济大学攻读博士学位研究生培养工作规定(2016年修订).doc...
  10. JDY-24M级蓝牙简介
  11. 国内App推广N种方法,总有几种适合你
  12. URP渲染管线实战教程系列 之URP渲染管线实战解密(一)
  13. 祖籍-山西省洪洞县大槐庄
  14. 设计模式学习(十七) 观察者模式 Observer
  15. 西门子plc S7-1200学习历程(1)
  16. P1282 多米诺骨牌
  17. I Want to Know
  18. 电视剧《奋斗》精彩对白节选---(七)
  19. 不改一行代码!快速迁移 Flask 应用上云
  20. flask使用Blueprint

热门文章

  1. 计算机在智能交通系统中应用,浅议计算机技术在现代智能交通系统中的应用
  2. linux 双线,linux 双线解决方案
  3. 怎样用c语言实现CPU超频,教你用最简单的方法给你的显卡超频
  4. 卸载windowsxp正版验证补丁
  5. 实现iconfont图标渐变
  6. 计蒜之道(阿里的新游戏)第一题 解题报告
  7. 安装 TeX 及其必要的依赖
  8. 《LoadRunner 12七天速成宝典》—第1章 1.5节安装LoadRunner 12.5
  9. 苏宁818战报幕后:“冬有双11,夏有818”如何形成
  10. 【Java】实现聊天程序(完整版)