背景
在Java系统实现过程中,我们不可避免地会借助大量开源功能组件。然而,这些组件往往功能丰富且体系庞大,官方文档常常详尽至数百页。而在实际项目中,我们可能仅需使用其中的一小部分功能,这就造成了一个挑战:如何在有限的时间和精力下,高效地掌握并使用这些组件的核心功能,以实现投入产出最大化?
针对这一问题,我基于二八原则,整理编写本文。
首先,我会聚焦于组件的常见和核心功能,这些功能通常是我们在日常开发中频繁使用到的,也是构建稳定、高效系统的基石。通过深入了解这些核心功能的使用方法和最佳实践,我们可以确保在关键点上投入足够的精力,从而避免在实际使用中掉入陷阱。
其次,我会以问题为导向,将实用性作为第一要素,对组件的功能进行筛选和整理。这意味着我会优先关注那些在项目中实际需要用到的功能,而对于那些特定场景下才会用到的功能,我会在文中提及但不做详细展开。这样做的好处是,我们可以在保证核心功能得到充分理解的同时,减少不必要的阅读负担,提高学习效率,降低投入成本。
最后,我会注重内容的精炼和易读性。通过简明扼要的文字描述和直观的示例代码,帮助读者快速理解并掌握组件的核心用法。
同时,我也会结合经验指出常见的问题和注意事项,以便读者在使用过程中能够规避一些常见的错误和陷阱。
综上所述,通过这个系列的内容整理,我希望能够帮助读者在有限的时间和精力下,高效地掌握并使用这些开源功能组件的核心功能,满足系统实现的需要。
注:部分内容章节由AI辅助生成草稿,我对其进行了复核和修订,修复了有问题和有错误的部分。
数据库对比
一、性能核心差异
1. 轻量级操作与高并发处理
- MySQL:
- 优势:轻量级读写(如插入、更新)速度更快,适合Web应用、中小型系统(日均百万级以下请求)。
- 劣势:默认的行级锁在高并发写入时容易导致锁争用,需通过分库分表或读写分离优化。
- Oracle:
- 优势:采用多版本并发控制(MVCC)和块级锁,支持更大规模的并发事务(如金融交易系统)。
- 劣势:复杂功能带来额外开销,轻量级操作性能可能不如MySQL。
- SQL Server:
- 优势:在Windows环境中与.NET深度集成,事务处理效率较高,适合企业级OLTP(联机事务处理)。
- 劣势:跨平台扩展性弱于MySQL,Linux版本功能受限。
2. 复杂查询与数据分析
- MySQL:
- 劣势:复杂JOIN查询优化较弱,需依赖外部工具(如ClickHouse)进行大数据分析。
- 优势:简单聚合查询(如COUNT、SUM)响应快,适合报表生成。
- Oracle:
- 优势:优化器智能选择执行计划,支持并行查询和物化视图,适合TB级数据仓库。
- SQL Server:
- 优势:集成SSIS(数据集成服务)和SSAS(分析服务),适合BI(商业智能)场景。
3. 存储引擎与扩展性
- MySQL:
- 多存储引擎:InnoDB(事务支持)、MyISAM(读密集型)、Memory(缓存表)。
- 扩展性:通过分片(Sharding)支持水平扩展,但需手动管理。
- Oracle:
- 存储结构:表空间管理更精细,支持高级分区(如范围、哈希分区)。
- 扩展性:垂直扩展(升级硬件)能力强,集群方案(RAC)成熟但成本高。
- SQL Server:
- 扩展性:依赖Windows Server Failover Clustering,横向扩展能力有限。
二、适用场景对比
场景 | 推荐数据库 | 理由 |
---|---|---|
Web应用/中小型系统 | MySQL | 低成本、高读写速度,开源生态完善(如LAMP架构) |
金融/高并发事务 | Oracle | 强一致性、高可用性(如闪回查询、Data Guard) |
企业级Windows应用 | SQL Server | 与.NET无缝集成,图形化管理工具(SSMS)易用 |
大数据分析 | Oracle | 并行处理、复杂查询优化,适合PB级数据 |
快速原型开发 | MySQL | 部署简单、社区资源丰富,适合敏捷开发 |
三、成本与维护复杂度
- 成本:
- MySQL:社区版免费,商业版(企业版)价格较低。
- Oracle:按CPU核心收费,企业版年费可达百万级。
- SQL Server:标准版价格适中,但Windows Server授权增加成本。
- 维护:
- MySQL:运维简单,但需手动优化分片和索引。
- Oracle:需专业DBA团队,学习曲线陡峭。
- SQL Server:Windows生态工具链完整,自动化程度高。
四、典型性能测试数据(参考)
测试项 | MySQL 8.0 | Oracle 19c | SQL Server 2022 |
---|---|---|---|
单表插入(万条/s) | 1.2 | 0.8 | 1.0 |
复杂JOIN查询(s) | 8.5 | 3.2 | 6.7 |
并发事务(TPS) | 4500 | 12000 | 6000 |
数据压缩比 | 中等 | 高(OLAP) | 中等 |
五、选型建议
- 优先MySQL:若项目预算有限、需求简单或需快速迭代(如创业公司、个人项目)。
- 选择Oracle:对事务一致性、高可用性要求严苛(如银行核心系统)。
- 考虑SQL Server:已有微软技术栈(如C#、Azure),需深度集成企业服务。
示例场景:
- 电商平台:MySQL(用户行为日志)+ Redis(缓存)+ ClickHouse(分析)。
- ERP系统:SQL Server(业务逻辑)+ Power BI(报表)。
- 证券交易系统:Oracle RAC(高可用集群)+ GoldenGate(数据同步)。
通过综合性能、成本及生态,合理选择数据库可显著提升系统效率和稳定性。
MySql常用版本
一、主流版本概览
- MySQL 5.7(2015年发布)
- 核心特性:
- 支持JSON数据类型,便于处理非结构化数据。
- 引入全局事务ID(GTID),优化主从复制。
- 在线DDL操作,减少表结构变更时的锁表时间。
- 适用场景:兼容性强,适合传统企业应用及需要稳定性的旧系统。
- 现状:2023年10月结束官方支持,建议新项目升级。
- 核心特性:
- MySQL 8.0(2018年发布)
- 核心特性:
- 默认字符集改为
utf8mb4
,支持Emoji和四字节字符。 - 新增窗口函数、公共表表达式(CTE)、角色权限管理。
- 事务性能提升,InnoDB引擎优化。
- 默认字符集改为
- 适用场景:新项目首选,适合需要现代SQL特性及高并发的系统。
- 现状:长期支持版本(LTS),推荐生产环境使用。
- 核心特性:
- MySQL 8.2/9.x(2023年后更新)
- 核心特性:
- 增强备份工具(如
mysqldump
用户管理功能)。 - 改进开发者工具,支持自动化测试。
- 增强备份工具(如
- 适用场景:需最新功能或云原生部署的项目。
- 核心特性:
二、版本分类与选择建议
- 社区版(Community Edition)
- 特点:免费开源,包含核心功能,适合个人开发者及中小团队。
- 推荐版本:8.0.x(最新稳定版)。
- 企业版(Enterprise Edition)
- 特点:付费授权,提供高级功能(如审计插件、热备份、企业级监控)。
- 适用场景:金融、电信等对安全性和高可用性要求严格的行业。
- 分支版本
- MariaDB:兼容MySQL语法,社区驱动,适合需要免费替代方案的项目。
- Percona Server:优化InnoDB性能,提供增强版查询分析工具。
三、版本选型关键因素
- 兼容性需求:
- 旧系统迁移优先选择5.7,新项目直接使用8.0。
- 注意部分存储引擎(如MyISAM)在8.0中功能受限。
- 性能要求:
- 高并发写入场景推荐8.0,其事务处理效率较5.7提升30%。
- 复杂查询场景可搭配Percona分支优化性能。
- 安全性:
- 企业版支持TDE(透明数据加密)和审计日志,满足合规需求。
- 社区版需自行配置SSL加密和权限管理。
四、版本查看方法
- 命令行查询:
SELECT VERSION(); -- 查看当前版本
- 终端命令:
mysql --version -- 显示客户端版本
- 配置文件:
- 检查
my.cnf
或错误日志中的版本标识。
- 检查
五、总结建议
- 新项目:优先选择MySQL 8.0社区版,充分利用新特性及长期支持。
- 旧系统升级:评估兼容性后逐步迁移至8.0,避免直接跨版本升级。
- 企业级需求:考虑企业版或Percona分支,获取高级功能及技术支持。
常用存储引擎
MySQL 数据库支持多种存储引擎,但最常用的两种是 InnoDB 和 MyISAM。这两种引擎各有特点,适用于不同的使用场景:
- InnoDB
- 事务性:InnoDB 支持事务处理,具有提交、回滚和崩溃恢复能力。
- 外键约束:支持外键约束,保证了数据的完整性。
- 行级锁定:提供了更高的并发性,因为它支持行级锁定。
- 崩溃恢复:具有日志功能,可以在发生故障后恢复到崩溃前的状态。
- 支持 MVCC:多版本并发控制,提高了读取操作的性能。
- 默认引擎:从 MySQL 5.5 开始,InnoDB 是 MySQL 的默认存储引擎。
- MyISAM
- 非事务性:MyISAM 不支持事务处理。
- 表级锁定:每次读取或者写入都需要获取表级锁,这在高并发的环境中可能会成为性能瓶颈。
- 全文索引:支持全文索引,适合用于搜索引擎。
- 速度:对于只读或轻度更新的应用,MyISAM 通常提供比 InnoDB 更好的读取性能。
- 空间效率:MyISAM 会占用更多的磁盘空间,因为它为每个表存储了三个文件:数据文件(.MYD)、索引文件(.MYI)和结构文件(.frm)。
选择哪种存储引擎取决于你的具体需求。如果你需要事务支持、行级锁定或者外键约束,InnoDB 是更好的选择。如果你的应用主要是读取操作,并且不需要事务支持,MyISAM 可能会更适合。
此外,还有其他存储引擎,如 Memory(用于临时表和高速缓存)、Archive(用于存储大量未修改的数据)、Federated(用于访问远程 MySQL 服务器上的表)等,但它们通常用于特定的场景。
数据类型一览
一、数值类型
1. 整数类型
类型 | 字节 | 有符号范围 | 无符号范围 | 典型应用场景 |
---|---|---|---|---|
TINYINT | 1 | -128 ~ 127 | 0 ~ 255 | 年龄、状态标志(如0/1) |
SMALLINT | 2 | -32768 ~ 32767 | 0 ~ 65535 | 商品库存量、小型计数器 |
MEDIUMINT | 3 | -8,388,608 ~ 8,388,607 | 0 ~ 16,777,215 | 中型数据(如用户ID) |
INT | 4 | -231 ~ 231-1 | 0 ~ 4,294,967,295 | 订单编号、主键ID |
BIGINT | 8 | -263 ~ 263-1 | 0 ~ 1.8e19 | 大数据量(如日志流水号) |
2. 浮点与定点类型
类型 | 字节 | 精度特点 | 典型应用场景 |
---|---|---|---|
FLOAT | 4 | 单精度,约6-7位有效数字 | 科学计算、非精确测量 |
DOUBLE | 8 | 双精度,约15位有效数字 | 地理坐标、复杂计算 |
DECIMAL | 可变 | 精确小数,格式DECIMAL(M,D) | 金融金额、精确计算 |
二、字符串类型
1. 定长与变长字符串
类型 | 最大长度 | 存储特点 | 典型应用场景 |
---|---|---|---|
CHAR(N) | 255字符 | 固定长度,适合短且固定数据 | 性别(M/F)、邮编 |
VARCHAR(N) | 65535字符 | 可变长度,节省存储空间 | 用户名、地址描述 |
2. 文本类型
类型 | 最大存储量 | 特点 | 典型应用场景 |
---|---|---|---|
TINYTEXT | 255字节 | 短文本存储 | 简短备注、标签 |
TEXT | 64KB | 中等长度文本 | 文章内容、评论 |
MEDIUMTEXT | 16MB | 大文本存储 | 长篇小说、日志详情 |
LONGTEXT | 4GB | 超长文本 | 富文本编辑器内容 |
3. 枚举与集合
类型 | 特点 | 典型应用场景 |
---|---|---|
ENUM | 单选值(如 ‘男’,‘女’) | 性别、状态选项 |
SET | 多选值(如 ‘阅读,运动,音乐’) | 用户兴趣标签 |
三、日期与时间类型
类型 | 格式 | 范围 | 典型应用场景 |
---|---|---|---|
DATE | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 | 出生日期、事件日期 |
TIME | HH:MM:SS | -838:59:59 ~ 838:59:59 | 持续时间、课程时长 |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 | 订单创建时间、日志记录 |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 最后登录时间、自动更新时间戳 |
四、二进制类型(存储非文本数据)
类型 | 最大存储量 | 特点 | 典型应用场景 |
---|---|---|---|
BLOB | 64KB | 二进制大对象 | 小图片、PDF文档 |
MEDIUMBLOB | 16MB | 中等二进制数据 | 音频文件、设计稿 |
LONGBLOB | 4GB | 超大二进制数据 | 视频文件(不推荐直接存储) |
五、特殊类型
类型 | 说明 | 应用场景 |
---|---|---|
JSON | 存储结构化JSON数据 | API响应数据、配置信息 |
GEOMETRY | 空间数据类型(点/线/面) | 地理信息系统(GIS) |
数据类型选用建议
- 数值类型
- 从性能角度,优先选择最小适用类型(如年龄用TINYINT而非INT),但实际应用过程中,在数据量超大的情况下才会考虑使用TINYINT这种细分类型,通常使用INT即可。
- 精确计算(如金额)必须用DECIMAL,避免FLOAT/DOUBLE的精度丢失,这是一个常见的致命问题,拿FLOAT/DOUBLE存储金额,计算结果会产生误差导致业务数据不准确。
- 字符串类型
- 原则上定长字段用CHAR(如性别),变长用VARCHAR(如地址),实际使用定长字段的场景比较少,考虑到需求变更的可能性(原本定长的业务属性变成了变长),通常都使用变长,很少使用定长。
- 避免过大的VARCHAR长度(如VARCHAR(255)可能浪费存储),原则上字段宽度应在充分调研业务需求的情况后,设定比实际业务要求略长一些,实际应用过程中,一些非科班出身的软件系统设计与开发人员,会采用简单暴力的方式将几乎全部字段都设计为VARCHAR(255),特别是低代码平台配置的情况下,这是一种陋习,需摒弃。
- 日期类型
- 需时区支持或自动更新用TIMESTAMP,否则用DATETIME。
- 精确到天的业务数据,建议也使用DATETIME而不是DATE类型。
- 如果是时间,看业务情况,建议使用VARCHAR类型存储,在应用程序中解析和处理,不使用TIME类型。
- 二进制数据
- 数据库具备存储文件的能力,但是该功能慎用或禁用,会导致数据库文件急剧膨胀,影响数据库运行性能以及数据备份的空间和耗时,建议文件还是存放到磁盘,数据库表中存储文件路径,而非直接存BLOB。
- 枚举类型
- 实际应用较少使用,通常使用VARCHAR类型存储,在应用程序中解析和处理。
- JSON数据
- 数据库具备存储JSON的能力,但是该功能慎用或禁用,需要二次解析,一些复杂的用户配置页面,如用户桌面配置、业务报表模板定义,采用JSON序列化,通常也是使用VARCHAR类型,而不是使用JSON数据类型。
大小写敏感问题
mysql在Linux下数据库名、表名、列名、表别名大小写规则如下:
1、数据库名与表名严格区分大小写;
2、表别名严格区分大小写;
3、列名和列别名在所有情况下都是忽略大小写的;
4、变量名也是严格区分大小写的;
mysql在windows下都不区分大小写。
Linux下设置mysql大小写不敏感
1、连接数据库
例如:mysql -uroot -p123
root@test:/home# mysql -uroot -proot <uroot是用户名,proot是密码>
2.查看当前MYSQL字符集[在mysql命令行模式下执行]:
show variables like ‘character%’;
3.查询大小写敏感
show Variables like ‘%table_names’
查询结果: 显示0 是开启大小敏感的
lower_case_table_names=0(默认)区分大小写,lower_case_table_names=1表示不区分大小写
3.更改解决
修改/etc/my.cnf,在[mysqld]后边添加lower_case_table_names=1 重启mysql服务,这时已设置成功
完了记得重新启动mysql服务
一、启动方式
1、使用 service 启动:service mysqld start
2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start
3、使用 safe_mysqld 启动:safe_mysqld&
二、停止
1、使用 service 启动:service mysqld stop
2、使用 mysqld 脚本启动:/etc/inint.d/mysqld stop
3、mysqladmin shutdown
三、重启
1、使用 service 启动:service mysqld restart
2、使用 mysqld 脚本启动:/etc/inint.d/mysqld restart
数据库连接字符串常用参数
一、基础连接参数
参数名 | 说明 | 默认值 | 示例 |
---|---|---|---|
Server | 数据库服务器地址(同义词:Host、Data Source) | 无 | <font style="color:rgb(17, 20, 24);">Server=localhost</font> |
Port | MySQL服务端口号 | 3306 | <font style="color:rgb(17, 20, 24);">Port=3307</font> |
Database | 要连接的数据库名(同义词:Initial Catalog) | 无 | <font style="color:rgb(17, 20, 24);">Database=mydb</font> |
User Id | 数据库用户名(部分驱动支持简写:Uid) | 无 | <font style="color:rgb(17, 20, 24);">User Id=root</font> |
Password | 数据库密码(部分驱动支持简写:Pwd) | 无 | <font style="color:rgb(17, 20, 24);">Password=123456</font> |
二、字符集与编码
参数名 | 说明 | 默认值 | 示例 |
---|---|---|---|
Charset | 指定客户端与服务器的字符集(推荐使用<font style="color:rgb(17, 20, 24);">utf8mb4</font> 支持Emoji) | 无 | <font style="color:rgb(17, 20, 24);">Charset=utf8mb4</font> |
CharacterSet | 同<font style="color:rgb(17, 20, 24);">Charset</font> ,部分驱动专用参数 | 无 | <font style="color:rgb(17, 20, 24);">CharacterSet=utf8</font> |
UseUnicode | 是否启用Unicode编码(需与字符集参数配合使用) | false | <font style="color:rgb(17, 20, 24);">UseUnicode=true</font> |
三、连接池与性能优化
参数名 | 说明 | 默认值 | 示例 |
---|---|---|---|
Pooling | 是否启用连接池 | true | <font style="color:rgb(17, 20, 24);">Pooling=false</font> |
MaxPoolSize | 连接池最大连接数 | 100 | <font style="color:rgb(17, 20, 24);">MaxPoolSize=200</font> |
MinPoolSize | 连接池最小空闲连接数 | 0 | <font style="color:rgb(17, 20, 24);">MinPoolSize=5</font> |
ConnectionTimeout | 连接超时时间(秒) | 15 | <font style="color:rgb(17, 20, 24);">ConnectionTimeout=30</font> |
ConnectionLifeTime | 连接存活时间(秒),超时后自动销毁 | 0(不限制) | <font style="color:rgb(17, 20, 24);">ConnectionLifeTime=300</font> |
四、安全相关参数
参数名 | 说明 | 默认值 | 示例 |
---|---|---|---|
SslMode | SSL加密模式(可选值:None/Preferred/Required) | None | <font style="color:rgb(17, 20, 24);">SslMode=Required</font> |
AllowPublicKeyRetrieval | 是否允许从服务器获取公钥(某些SSL配置需启用) | false | <font style="color:rgb(17, 20, 24);">AllowPublicKeyRetrieval=true</font> |
TrustServerCertificate | 是否信任服务器证书(测试环境可用,生产环境不推荐) | false | <font style="color:rgb(17, 20, 24);">TrustServerCertificate=true</font> |
五、高级配置参数
参数名 | 说明 | 默认值 | 示例 |
---|---|---|---|
AllowMultiQueries | 是否允许单次执行多条SQL语句(分号分隔) | false | <font style="color:rgb(17, 20, 24);">AllowMultiQueries=true</font> |
AutoReconnect | 连接断开时是否自动重连(可能引发数据不一致,慎用) | false | <font style="color:rgb(17, 20, 24);">AutoReconnect=true</font> |
ServerTimezone | 指定服务器时区(解决时间偏差问题) | 系统时区 | <font style="color:rgb(17, 20, 24);">ServerTimezone=Asia/Shanghai</font> |
六、不同编程语言示例
1. Java (JDBC)
String url = "jdbc:mysql://localhost:3306/mydb?user=root&password=123456&useSSL=false&serverTimezone=UTC";
2. C# (ADO.NET)
string connStr = "Server=localhost;Database=mydb;Uid=root;Pwd=123456;Charset=utf8mb4;Pooling=true;";
3. Python (mysql-connector)
config = {
'user': 'root',
'password': '123456',
'host': 'localhost',
'database': 'mydb',
'charset': 'utf8mb4',
'pool_size': 5
}
七、注意事项
- 字符集一致性:确保客户端、连接字符串、数据库表三者的字符集一致(推荐
<font style="color:rgb(17, 20, 24);">utf8mb4</font>
)。 - SSL加密:生产环境务必启用
<font style="color:rgb(17, 20, 24);">SslMode=Required</font>
并配置有效证书。 - 连接池优化:根据并发量调整
<font style="color:rgb(17, 20, 24);">MaxPoolSize</font>
,避免连接耗尽。 - 时区问题:跨时区应用需设置
<font style="color:rgb(17, 20, 24);">serverTimezone</font>
(如<font style="color:rgb(17, 20, 24);">Asia/Shanghai</font>
)。