1. 概述
1.1 数据库定义
数据是数据库中存储的基本对象,包括数字、图像、音频等形式,在进行逐级抽象后存储在数据库中。数据库是由特定软件,即数据库管理系统(DBMS)搭建、处理、维护的数据及数据间逻辑关系的集合体。它面向多种应用,可以被多个用户、多个应用程序所共享。DBMS是负责数据库搭建、使用和维护的大型系统软件,它对数据进行统一控制管理,以保证数据的完整性和安全性。数据库和数据库管理系统共同组成了数据库系统。
1.2 发展历程
1.3 SQL介绍
2. 数据库选型
2.1 按数据结构分类
- 传统关系型数据库,保证ACID特性,是当今主流的数据库类型,如Oracle、MySQL、PostgreSQL、SQLite、SQLServer;
- NoSQL数据库,NoSQL即Not Only SQL,NoSQL数据库指那些不使用关系模型、分布式、不保证遵循ACID原型的数据库。列式(HBase、Cassandra、ClickHouse),键值(Redis、Memcached),图数据库(Neo4J,TigerGraph),文档(MongoDB、CouchDB、ElasticSearch),时序(InfluxDB、Prometheus);
- NewSQL数据库,NoSQL虽然在可扩展性和可用性方面表现优秀,但是无法满足事务一致性的要求。2011年Matthew Aslett提出了“NewSQL”术语用以定义新出现的“可横向扩展的OLTP关系型数据库”。MemSQL、VoltDB、NuoDB、TIDB;
- 多模数据库,是一种可以在多个模型中存储和查询数据的数据库,为异构数据提供了较好的解决方案。数据库扩展原有模型的路径主要有四种:新存储方式+新数据模型、原存储方式+新数据模型、新接口+原存储模型、原存储模型;
2.2 按部署模式分类
- 本地部署,在物理机、虚拟机上部署,最传统的方式;
- 云托管数据库,云服务厂商负责管理与维护基础设施,并提供优化、备份、恢复、监控等全套解决方案。企业用户无需购买服务器、交换机等软硬件,后续也无需投入大量的人力成本去运维,可以更专注于企业的应用开发,如阿里云-RDS-MySQL版、腾讯云MySQL,云托管数据库与开源版数据库相比,是一种“开箱即用、弹性扩展、省钱省力、高度可用”的解决方案;
- 云原生数据库,基于云环境设计的新型数据库,天生匹配云环境和分布式事务。其核心是存储与计算分离,同时还具备高性能、高可扩展、一致性、容错、易于管理和多云支持等特性。阿里云PolarDB、腾讯云TDSQL、华为云GaussDB
上层需求驱动,底层技术支撑,存算分离,优化资源编排,云原生数据库是未来趋势:
对于非云原生的数据库,大体的迁移步骤可参考下图:
2.3 按功能分类
- OLTP事务型数据库,主要做实时事务处理,通常对规范化、实时性、稳定性、事务性、一致性、完整性等有要求,比如处理用户基本信息、处理订单合同、处理银行转账业务、企业的ERP系统和OA系统等;
- OLAP分析型数据库,主要来自数据仓库、数据集市或数据湖的数据,主要做历史数据分析,为商业决策提供支持,频率较低地,对大量数据,做读取、聚合、计算、分析,实时性要求不高,对吞吐能力要求较高;
- HTAP混合型数据库,随着数据价值的进一步挖掘,企业对数据库系统也提出了新的要求。现阶段企业为满足交易处理和分析的需求,往往采用OLTP+OLAP的组合方案。但二者之间往往存在时延,无法满足企业实时分析的需求;同时管理两个平台往往需要组建两支团队,运维成本高。 HTAP (Hybrid Transactional/Analytical Processing) 混合型数据库基于新的计算存储框架,能够同时支撑OLTP和OLAP场景,避免传统架构中大量数据交互造成的资源浪费和冲突。此外,HTAP基于分布式架构,支持弹性扩容,可按需扩展吞吐或存储,轻松应对高并发、海量数据场景;
3. 数据库连接池
3.1 连接池介绍
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。通过释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等。也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。目前,市面上常见的数据库连接池组件主要有如下几个:
- C3P0,历史悠久,过于复杂,性能差,不推荐使用。由于一度是Hibernate内置的数据库连接池而被开发者熟知,但是由于性能和复杂度,官方已经放弃维护;
- DBCP,依赖Commons-Pool,性能差,属于Apache顶级项目Commons中的核心子项目,但DBCP并不是独立实现连接池功能的,它内部依赖于Commons-Pool项目;
- HikariCP,Spring Boot官方默认连接池;
- Druid,阿里巴巴开源的数据库连接池,深受企业级验证;
Druid的方案及接入性能对比可参考如下:
对于连接池来说,连接池本身的性能消耗在整个调用链路中通常占比不大,连接池的性能关键点是,连接是否LRU的方式重用,是否支持PSCache(PreparedStatementCache)才是性能的关键点。
3.2 连接池使用案例
以默认数据库连接池HikariCP为例:
1 | spring.datasource.hikari.minimum-idle=5 |
单个配置的含义:
minimum-idle
,最小空闲连接数;maximum-pool-size
,最大连接数,包括闲置和使用中的连接;idle-timeout
,连接允许在池中闲置的最长时间;max-lifetime
,池中连接最长生命周期,即最大存活时间;connection-timeout
,等待来自池的连接的最大毫秒数;connection-test-query
,用于测试连接是否可用的查询语句,基本不需要配置;
4. ORM开发框架
4.1 JDBC与ORM概念
JDBC(Java DataBase Connectivity),是Java连接数据库操作的原生接口。JDBC对Java程序员而言是API,为数据库访问提供标准的接口。由各个数据库厂商及第三方中间件厂商依照JDBC规范为数据库的连接提供的标准方法。
对象-关系映射(Object-Relational Mapping,简称ORM),ORM框架中是Java面向对象编程的思想完美体现。直白点说,ORM就是将代码里面的Java类与DB中的表进行映射,代码中对相关Java类的操作,即体现为DB中对相关数据库表的操作。
4.2 ORM框架选型
- JdbcTemplate,原生模式,需要手写查询结果和Java类的映射;
- MyBatis,类似的框架Mybatis-plus,FastMyBatis,在中文开发界很流行;
- Spring-Data-JPA,全自动框架,一般来讲不需要写任何sql,建表的过程也是全自动的,需要写的话,也可以直接写在注解参数里,同时建表的过程也是全自动的,开发者只需要写好对应的类和相关注解;
Spring Data Jpa是可以完全与数据库脱钩的,在代码迁移到其他数据库之后,只需要切换对应的Dialect就行了。而MyBatis由于所有SQL都是依赖数据库书写的,所以扩展性,迁移性比较差,则可能需要做更多的工作。
Spring Data Jpa自动生成的sql比较不符合人们的阅读习惯,而MyBatis的Sql则与开发的开发习惯结合较密切,因此在出了问题debug的时候, MyBatis会方便一些。
4.3 Spring Data Jpa接入流程
首先添加依赖:
1 | <dependency> |
配置文件引入数据库链接信息:
1 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver |
添加实体类,并制定数据表名:
1 |
|
再新建一个操作数据的Repository
:
1 |
|
接下来,直接操作这个Repository对该表进行增删改查操作即可。JPA也提供了对应的接口:
5. 数据库与大数据技术
以Hadoop为代表的大数据技术以低成本的方式提供海量数据的开发和运行处理,但缺点是结构化能力较差,早期不支持SQL语句解析。随着大数据技术发展,基于Hadoop的数仓工具Hive开始提供SQL查询功能,但整体性能较差。随后支持SQL查询的工具(如Spark SQL)开始涌现,大数据技术的分析处理能力提升,结构化趋势明显。另一方面,数据库天然具备强结构化能力,尤其关系型数据库原生支持SQL查询,但早期存储成本高,对海量数据的支持能力不足。但随着对象存储(OSS)被广泛应用,其低成本、高可用、数据持久及按需付费的特点,让数据库产品能够应对轻体量的大数据场景。由此,随着数据技术的发展创新,数据库与大数据技术的边界不断模糊,二者互相延伸。我们认为传统大数据技术有着更为丰富的生态,但是对技术要求较高,相比较而言,从仓向湖的延伸路线,更适合传统企业和中小企业。
数据库与大数据技术边界不断模糊,呈现融合趋势。
以上内容就是关于数据库开发入门级教程的全部内容了,谢谢你阅读到了这里!
Author:zhaoyh