[译]高性能Java持久化(1) - 前言
在企业级应用系统中, 一个好的数据访问层的设计会对整个系统的性能带来很大影响。根据Appdynamics¹的统计:
超过一半的的应用的性能瓶颈来自于数据库.
数据有很多种不同的格式(表行,索引节点),并且数据库记录会被多个并发用户读写。从并发角度而言,这是很具挑战性的任务。为了能强化数据访问层,数据访问逻辑必须与底层数据库很好地配合。
图1-1 数据访问技能栈
一个典型的RDBMS(关系型数据库管理系统)数据访问层掌握很多技术,最弱的技术会限制整个企业级解决方案。在进入更高级抽象层(比如ORM框架)前必须先精通底层技术。
1.1 数据库服务器与连通层
数据库手册不仅仅只是给数据库管理员用的。与数据库打交道但是却不知道它的原理,就跟无照驾驶是一样的。是否熟悉SQL标准和数据库特性是构建高性能应用的关键。
某些高效的特性因为不能再不同的数据库间通用,由于害怕数据库的一致性从而会避免使用这些技术。实际上,更常见的是维持使用一个低效的数据库层,而不是去使用一个新的数据库解决方案。
所有的数据访问都依赖于JDBC API去和数据库服务器通信。JDBC提供了很多性能优化技术,旨在降低事务响应时间、容纳更多的访问。
因此本书的第一部分将专注于JDBC,并且会讲到连接管理、Statement批量操作、Result结果集的读取和数据库事务的核心。
1.2 应用程序数据访问层
在企业级应用中有一些已经被证实有效的模式。Martin Fowler的《企业应用架构模式》是每一个企业应用开发者都应该阅读的。独立于对象关系映射模型,许多ORM框架都应用了很多模式,例如Unit of Work, Identity Map, Lazy Loading, Embedded
Value, Entity Inheritance or Optimistic and Pessimistic Locking。
1.2.1 ORM框架
ORM工具也可以加快应用开发速度,但是学习曲线毫无疑问是陡峭的。要掌握将关系型数据和领域模型连接的复杂的内在关系,唯一的办法就是在使用的过程中去了解它。
有时候即使说明文档都不一定够,为了解决一些性能相关的问题,不可避免地需要了解其源码。JPA擅于写数据是因为在持久化对象变化时所有DML语句会被自动执行。这样就可以加快迭代开发过程。
本书第二部分会介绍各种Hibernate特有的优化技术,例如id生成器、高效实体提取、状态转换、应用级事务和实体缓存。
1.2.2 原生查询构造器框架
JPA和Hibernate不是为了去取代SQL的。在一些应用中原生的SQL查询是不可避免的。JPA将普通的对象检索进行抽象,但是当某些读取和处理数据的时候,没有什么能比SQL更方便。
JPQL(Java Persistence Querying Language)将不同的数据库的查询规范进行了抽象,对上提供统一的API。因此它缺乏对某些特有功能的支持,例如Window Functions、Common Table Expressions、Derived tables和PIVOT。与JPA相反,jOOQ(Java Object Oriented Query)对数据库的特性支持非常好。它提供的类型安全的查询构造器可以防止应用遭受SQL注入攻击。
因此,本书第三部分会介绍使用jOOQ进行高级查询的技术。
关于数据库性能基准测试
本书中很多用于证明性能相对提升的基准测试。基准测试的结果通常依赖于底层硬件、操作系统或者数据库服务器配置、数据大小和并发模式。因此,性能的绝对值没有相对值重要。最相关的基准测试结果其实就是相对于实际生产系统的。
为了防止读者根据基准测试来比较两个不同的数据库从而得到一个错误的结论,书中会把数据库的名称模糊地记做DB_A,DB_B,DB_C和DB_D。
本书中所使用的所有示例的源码都在GitHub。