新書推薦:
《
西班牙内战:秩序崩溃与激荡的世界格局:1936-1939
》
售價:NT$
990.0
《
非对称创新:中国企业赶超战略 魏江 刘洋
》
售價:NT$
495.0
《
潜能觉醒
》
售價:NT$
395.0
《
初平:汉末群雄混战(190—195)
》
售價:NT$
245.0
《
建安:官渡大决战(196—200)
》
售價:NT$
245.0
《
权力的图像——近代的中国海图与交流
》
售價:NT$
840.0
《
中亚民族史
》
售價:NT$
840.0
《
人工智能与智能制造:概念与方法 [美]马苏德·索鲁什 [美]理查德·D.布拉茨
》
售價:NT$
640.0
|
編輯推薦: |
编辑推荐
随着遗留系统和其他关键系统的不断在线迁移,持续运行的需求势在必行。如今,代码不仅要处理数据问题,还要处理网络中断、存储系统、电力、辅助系统等硬性的外部问题,这本实用指南为系统管理员、DevSecOps工程师、云架构师简明而全面的介绍如何使用PL/SQL开发弹性数据库解决方案。
集成专家Stephen B. Morris带领你理解这种语言,构建PL/SQL工具箱,并整理出一套可重复使用的组件和模式。你将深入了解将工具箱与需求驱动、特征导向的方法相结合的益处,并学习如何结合弹性尺度制定弹性解决方案。
专家推荐
“Stephen拿出了一种很好的方法。即使你没有全盘照搬,也会从中发现一些有助于你完成项目的技巧和工具。”
——Patrick Barel
ACE Director,
高级Oracle开发人员,Qualogy
“我强烈各位推荐这本书。它为避免和简化复杂的故障排除问题提供了宝贵的建议。”
——Sayan Malakshinov
Oracle ACE
“这本书棒极了,满满都是干货。书中以特征为导向的方法既新颖又易于应用。”
——Yash Agrawal
|
內容簡介: |
本书的主要内容有:在避免常见的PL/SQL反模式的同时构建可靠的PL/SQL解决方案。了解为什么将复杂的业务逻辑嵌入SQL往往是一个容易出问题的选择。学习如何识别和改进薄弱的PL/SQL代码。通过运行数据驱动的数据库内测试来验证PL/SQL代码。理解复杂PL/SQL系统的安全操作、维护、修改。学习思考特征而非只是用例的好处。
|
關於作者: |
Stephen B. Morris是一位独立作家和顾问,居住在爱尔兰。他在企业开发和网络应用领域拥有丰富的经验,从事专业代码编写工作已有30年之久,技术之旅涉及电信、金融、医疗保健、政府等多个行业。
|
目錄:
|
目录
前言 1
第Ⅰ部分 创建PL/SQL 工具箱
第1 章 弹性软件和PL/SQL .13
1.1 弹性软件15
1.2 弹性系统示例 .16
1.2.1 弹性需求:“是什么”与“怎么做” .16
1.2.2 使用PL/SQL 的动机:别用扳手切披萨 19
1.2.3 学习Java ORM 20
1.2.4 以数据为中心的复杂工作流 .20
1.2.5 将SQL 用于复杂的业务逻辑不是一个好主意 .23
1.3 一个警示故事 .23
1.3.1 拥抱PL/SQL 抽象 26
1.3.2 PL/SQL 的缺点 26
1.3.3 一种更好的方法 27
1.4 PL/SQL 入门 27
1.4.1 如何阅读现有或遗留的PL/SQL 代码 28
1.4.2 游标 31
1.5 理解PL/SQL 的学习及开发环境的必要性 34
1.6 弹性尺度35
1.6.1 捕获所有错误和异常:得分 = 0 .36
1.6.2 可恢复性:得分 = 2 36
1.6.3 可观测性:得分 = 0 37
1.6.4 可修改性:得分 = 5 37
1.6.5 模块化:得分 = 2 37
1.6.6 简单性:得分 = 5 37
1.6.7 编码规范:得分 = 5 37
1.6.8 可复用性:得分 = 2 38
1.6.9 可重复测试:得分 = 2 .38
1.6.10 避免常见反模式:得分 = 0 .38
1.6.11 模式演进:得分 = 0 38
1.7 小结 .39
第2 章 安装容器化Oracle Database 实例和
SQL Developer 41
2.1 安装虚拟化Oracle Database 41
2.2 Docker 入门 .43
2.3 配置Oracle Database 51
2.4 更新用户密码 .52
2.5 SQL Developer 入门 53
2.6 回顾基本的Docker 工作流57
2.7 运行SQL Developer 59
2.8 一个简单的模式 61
2.9 运行PL/SQL 代码 63
2.10 三个Docker 常见错误 .65
2.10.1 Docker 区分大小写 .65
2.10.2 急于连接数据库 66
2.10.3 由可怕的Windows 更新引发的Docker 问题 .67
2.11 Docker 命令行的替代 67
2.12 Docker 命令行的另一种替代 69
2.13 小结 71
第3 章 小试SQL Developer 73
3.1 修复烦人的PL/SQL 错误 .74
3.2 在数据库中安装PL/SQL 存储过程 .78
3.3 在数据库中安装存储过程 80
3.4 执行PL/SQL 存储过程 81
3.5 要点:错误乃良师 84
3.6 小结 .85
第4 章 在PL/SQL 代码中应用弹性尺度 87
4.1 弹性尺度需求1:捕获所有错误和异常 89
4.1.1 异常处理的变化 90
4.1.2 运行更新后的PL/SQL .92
4.2 弹性尺度需求2:可恢复性 100
4.3 弹性尺度需求3:可观测性 102
4.3.1 如果日志记录出现异常该怎么办? 103
4.3.2 更新模式 104
4.4 弹性尺度需求4:可修改性 107
4.5 弹性尺度需求5:模块化 111
4.5.1 日志记录包 . 117
4.5.2 创建日志记录包 119
4.5.3 整合日志记录功能 122
4.6 弹性尺度需求6:简单性 125
4.7 弹性尺度需求7:编码规范 126
4.8 弹性尺度需求8:可复用性 127
4.9 弹性尺度需求9:可重复测试 .129
4.9.1 安装utPLSQL 131
4.9.2 在SQL Developer 中创建utPLSQL 单元测试 133
4.10 运行utPLSQL 单元测试 135
4.11 弹性尺度需求10:避免常见的反模式 .144
4.11.1 代码过长 147
4.11.2 代码过于复杂 147
4.11.3 缺少异常/ 错误处理 .148
4.11.4 与异常共存 148
4.11.5 缺少模块化 148
4.11.6 无法确定根源的崩溃 149
4.12 弹性尺度需求11:模式演进 .150
4.13 弹性尺度变动汇总 154
4.14 小结 156
第Ⅱ部分 特性驱动开发
第5 章 调用PL/SQL . 161
5.1 两种PL/SQL 集成模型 161
5.2 使用作业调用PL/SQL .162
5.3 使用Java 程序调用PL/SQL .166
5.3.1 设置简单的Java 应用程序 167
5.3.2 运行Java 应用程序 .169
5.3.3 Java 错误归谁 173
5.3.4 读取数据库元数据 173
5.3.5 一些Java PL/SQL 陷阱 .175
5.3.6 Oracle Database 密码陷阱 175
5.4 小结 175
第6 章 特性驱动的PL/SQL 开发 . 177
6.1 什么是特性 177
6.1.1 SQL Developer 的一个特性 178
6.1.2 特性示例 181
6.2 剖析特性.184
6.2.1 阐明特性的共同目标186
6.2.2 允许定义特性能够完成的有用工作 187
6.2.3 定义特性辅助器和调用机制 188
6.2.4 定义检验特性及其组件的测试 188
6.2.5 确定特性及其组件的需求 188
6.3 将日志存储过程重塑为特性 .189
6.4 将update_employees 存储过程视为特性191
6.5 测试特性或垂直切片 193
6.6 业务关键型PL/SQL 代码 194
6.7 特性的其他方面 .195
6.7.1 特性与系统健康 195
6.7.2 特性和端点 .196
6.8 小结 197
第Ⅲ部分 综合运用PL/SQL 工具箱和特性驱动开发
第7 章 一个以流程为中心、基于特性的迷你项目 . 201
7.1 需求1:定义需求202
7.2 需求2:构建发票基本大纲 202
7.3 需求3:创建模式205
7.4 需求4:测试模式213
7.5 需求5:特性描述214
7.6 需求6:构建解决方案所需的PL/SQL 工具箱元素 .215
7.7 需求7:测试 215
7.8 需求8:构建弹性PL/SQL 解决方案 215
7.9 需求9:通过高级语言调用验证解决方案 216
7.10 小结 216
第8 章 从“做什么”到“怎么做:根据规范构建
特性组件 217
8.1 需求 218
8.2 定义需求.222
8.3 构建发票基本大纲 .222
8.4 创建模式.223
8.5 PROJECTS 数据表 227
8.6 模式测试.229
8.6.1 插入数据并验证约束229
8.6.2 验证PROJECTS 数据表的操作是否按预期工作 .231
8.7 功能工作流描述 .232
8.7.1 创建项目发票数据集232
8.7.2 从Java 代码调用特性 232
8.7.3 调用传递所需数据的PL/SQL 存储过程 233
8.7.4 插入对新的发票开具PL/SQL 存储过程的调用 233
8.7.5 先在SQL Developer 中运行初版PL/SQL 代码 235
8.7.6 在INVOICES 数据表中插入一行 237
8.7.7 添加两个辅助器 238
8.7.8 性能注意事项:PL/SQL 与SQL 246
8.7.9 项目状态简报 .247
8.7.10 重温项目功能状态报告 250
8.8 小结 253
第9 章 构建完整的特性:最终项目集成 255
9.1 回顾弹性尺度 255
9.2 结合模型重新审视模式 257
9.3 重回错误和异常管理 261
9.4 弹性需求备忘录 .273
9.5 可恢复性.274
9.6 可观测性.274
9.7 可修改性.274
9.8 模块化 .275
9.9 测试 281
9.10 构建基础的发票生成工具285
9.11 添加日志 285
9.12 从Java 代码调用日志记录的PL/SQL 存储过程 287
9.13 小结 290
第10 章 尾声 293
10.1 一些要点 296
10.2 避免严重的反模式 298
10.3 Docker:学习Oracle Database 的一项技术 299
10.4 把错误视为老师并阅读代码 300
10.5 遗留代码和弹性尺度 .300
10.6 PL/SQL 和高级语言集成 .301
10.7 特性作为粗粒度的替代物301
10.8 小结 302
附录A Oracle 本机安装故障排除 . 303
附录B Oracle Database 日志记录的其他选项 311
|
內容試閱:
|
前言关系型数据库依然是有史以来最成功的技术之一。多年来,关系型数据库面临了诸多挑战。例如,在20 世纪90 年代末出现的面向对象的数据库曾有望取代占据主导地位的关系模型。将近四分之一个世纪后,关系型系统依然处于强势地位,这种屹立不倒的背后有很多因素。最近加入战场的挑战者中包括NoSQL 产品,比如MongoDB。不过出于多种原因,关系型数据库在IT 领域中继续保持着显著地位。扎实掌握Oracle、IBM、Microsoft 等公司的关系型数据库,仍然是IT 技能组合中的加分项。开源关系型数据库也不例外,比如MySQL。我从事过的所有开发者工作几乎都要求至少具备一定程度的SQL 知识。有些工作还要求懂得PL/SQL等存储过程语言。正如你将在本书中看到的,人们对于SQL 和PL/SQL 在高级语言(Java、C#、JavaScript 等)中的角色常常存在很大的困惑。我对多语言领域中存在的一些常见的反模式作了讨论。由于种种原因,相较于PL/SQL,用户往往有强烈的意愿选择完全基于嵌入式SQL 和对象关系映射的解决方案,这可能会导致不经意间使用反模式,从而产生脆弱的代码。我仔细研究了Oracle PL/SQL,希望能够为创建弹性数据库解决方案奠定良好的基础。在我们这个日益以数据为主导、以数据为中心的世界,对弹性系统的需求从未如此迫切。本书适合的读者如果你对学习数据库和PL/SQL 感兴趣,这本书是一个不错的入手点。本书采用了从第一性原理的方法,因此不需要太多的基础知识。我们重点关注的是PL/SQL 中的良好实践,并使用需求分析和指标来帮助各种技术水平的读者。那些涉及多种语言(比如Java、JavaScript、C# 等)的组织员工会发现这本书的价值。这类组织通常也使用一种或多种数据库技术,其中就包括PL/SQL。尽管他们的系统每天都在运行 PL/SQL,但开发人员不一定只使用PL/SQL。也就是说,PL/SQL 并不是主力开发语言。由于PL/SQL 用得不多,开发人员在语言构件和抽象方面未必懂得最佳解决方案。结果往往令人失望,更别提什么弹性了。这也增加了DevOps 成本,而且改善的希望渺茫。后者甚至可能因为Oracle 产品中自主技术的出现而加剧。换句话说,Oracle 转向自主机制的做法可能会产生令人尴尬的效果,使一些拙劣的数据库解决方案成为焦点。我相信本书能为第一次接触PL/SQL 的用户以及有经验的PL/SQL 开发人员带去不少帮助。除了批处理风格(batch-style)的PL/SQL 解决方案外,我还探讨了在Java 内调用PL/SQL 这一棘手的问题。面向需求在整本书中,我尝试制定简单广泛的设计和编码需求。在深入探讨实现细节之前,先阐明这些需求,这为后续代码提供了蓝图,也是指导编码过程的一种良好的通用做法。阐明良好的需求是软件开发中一项强大的技能,这有助于任何语言的编程,而不仅仅局限于 PL/SQL。正如我过去在写作中经常提到的,需求分析和设计是扎实编码的必要前提。有句老话说得好:编码越早,项目越久。这句话适用于过去,也同样适用于今天。本书中的一些需求导向可以视为非功能性需求。也就是说,这些需求不是针对特定业务问题或功能变化的。相反,这里描述的弹性需求是创建整体弹性解决方案的指南。迈向策略性编码在众多行业从事IT 工作多年的过程中,我认为现代编码大多是战术性的。很多组织的需求清单都很长,实际上根本无法实现。这对于底层业务是一个相当严重的威胁,因为底层业务的正常运行依赖于这些新的或改动过的功能。在缺乏完善流程的情况下,救火队员似的编码方式很容易成为常态。这种模型鲜少是可持续的,甚至可能导致过高的开发人员流动率,从而进一步加剧问题。采用更注重需求的思维模式能够实现更具策略性的编码方法。在PL/SQL 代码示例中,我旨在展示这种工作模式。策略性编码的一个关键方面是接受某些非功能性需求。我们会看到,这种例子包括为可观测性和可修改性进行编码。除此之外,策略性编码风格还包括简单性、模块化和其他特性。代码的简单性为什么重要?要回答这个问题,只需看看平均代码库(average codebase)。如今,大多数代码库都至少包含一种主流框架。我在2007 年左右第一次开始使用像Spring 这样的框架,当时就被其复杂性震住了。这只是我的一家之言,但我相信这个框架最终会变得非常复杂,必须作为Spring Boot(我也使用过)的一部分进行大幅修改。然而,Spring Boot 试图隐藏旧Spring 的许多复杂性。在我曾参与过的Spring Boot 项目中,集成还需要调试框架本身。这并不适合简单的编码,往往需要一组开发人员共同尝试各种方案,才能让代码正常工作。这跟简单性完全不沾边。作为策略性PL/SQL 编码风格的一部分,第Ⅱ部分和第Ⅲ部分介绍了作为系统能力宏观建模手段的特性驱动开发。我认为,特性驱动开发可作为一种开展弹性编码的方法。弹性软件是过程,不是目的每一个新需求及其相关代码都会对整体解决方案的弹性产生影响。弹性软件不是你想要就能有的。我们不能只是说“要确保这个新特性具有弹性。”怎么就不能呢?因为我们还不知道什么是弹性以及如何将其应用于我们的代码。为了解决这些复杂的问题,本书首先仔细描述了何为弹性。即使是最大的万亿级公司也在竭力编写弹性代码。难点在于,弹性通常是根据多个软件系统在承压期间互动的成功程度来判断的。因此,如果系统X 具有弹性,系统Y 不具有弹性,那么整个系统(X Y)很可能没有弹性。大型企业实体的灾难恢复周期时间目前(2023 年)在45 分钟以内。即便是在系统功能受限或损坏,上游或下游系统暂时不可用的情况下,要让代码恢复正常运行,这些时间也并不充裕。为了缓解弹性定义的难题,我引入了弹性尺度。这是一组简单的规则,可用于指导设计和编码工作。我们的目标是消除以下五种常见反模式:? 复杂性。? 脆弱的代码。? 代码的未来维护成本。? 性能低下。? 关注点分离不良。这听起来口气不小!我们怎么样解决这些反模式?为此,需要某种弹性尺度:1. 能够捕获所有错误和异常。2. 可恢复性。3. 可观测性。4. 可修改性。5. 模块化。6. 简单性。7. 编码规范。8. 可复用性。9. 可重复测试。10. 避免常见的反模式。11. 模式(schema)演进。那么,什么是弹性尺度呢?弹性尺度我引入了一种用数值表示数据库解决方案弹性的尺度。虽然纯粹是经验性的,但这种尺度说明了PL/SQL 的脆弱用法与更具弹性的方法之间的区别。通过提高某个PL/SQL 块的得分,代码就会变得更有弹性。迭代地使用该尺度可以帮助你找到一种强有力的PL/SQL 重构方法。让PL/SQL 解决方案更具弹性的还有其他原因。例如,Oracle 正在不断引入其他技术来提高其产品的内在弹性。这种例子还包括(但不限于):? 自愈元素。? 自主数据库技术? 避免超量使用CPU、网络、内存。在编写PL/SQL 代码时注重弹性设计,就是在某种程度上与Oracle 在这一领域的努力保持同步。这使得你的代码在由这些Oracle 产品构建的系统中成为更好的一员。你的弹性代码将更轻松地融入愈发弹性化的Oracle 生态系统中。弹性解决方案和灾难恢复在我们这个日益互联的世界中,IT 灾难是不幸的生活现实。停机是常有的事。衡量一个企业IT 质量的方面之一就是其从灾难中恢复的速度。例如,数据中心因某种原因离线,会给企业造成重大服务损失。这是弹性的宏观层面。大型组织会因故障而蒙受巨大损失,这可能是财务损失和/ 或声誉损失。无论是哪种情况,许多此类组织都会制定灾难恢复目标,比如每年允许x 分钟的停机时间。即使对于大型企业来说,x 的值也低得出奇。在灾难恢复期间,让代码快速恢复运行非常重要。重要的是要认识到,不能让你的代码对x 值产生负面影响。例如,如果你的代码在中断恢复后无法运行,那么为追踪问题而建立足够的源代码日志记录则至关重要。尤其是当问题出现在你无法直接控制的下游或上游的依赖系统中时,更是如此。要是日志记录为提供了问题根源的可靠线索,在停机修复期间,你的同事绝对会感谢你给出的这些信息。每一行代码都会对组织的整体弹性产生积极或消极的影响。这属于弹性的微观层面。虽然这是一个广阔的领域,值得另写一本书,但我将深入探讨编写弹性PL/SQL 的主题及其在帮助整个组织产生弹性解决方案方面的重要性。以图表驱动的叙述方式我坚信图表在清晰描述思路和代码工作流方面的巨大作用。本书大量使用屏幕截图来说明所述代码的实际运行情况。我希望这种叙述风格能对读者有所帮助。使用示例代码本书示例代码和练习等补充材料可从https://github.com/stephenbjm/plsql-resilience下载。如果你有技术疑问或在使用示例代码时遇到问题,请发送电子邮件至 errata@oreilly.com.cn。本书旨在帮助你完成工作。一般来说,你可以在自己的程序或文档中使用本书提供的示例代码。除非需要复制大量代码,否则无需联系我们获得许可。例如,使用本书中的一些代码片段编写程序不用获得许可,销售或分发O’Reilly 图书的示例光盘则需要获得许可。引用本书中的示例代码回答问题不用获得许可,将本书中的大量示例代码放到产品文档中则需要获得许可。我们感谢但并不强制要求你在引用本书内容时标注出处。出处说明通常包括书名、作者、出版社和ISBN,例如:“Resilient Oracle PL/SQL by Stephen B. Morris(O’Reilly). Copyright 2023 Omey Communications Limited, 978-1-098-13411-2”。如果你觉得自己对示例代码的用途超出了上述许可的范围, 欢迎通过permissions@oreilly.com 与我们联系。法律声明所有来自Oracle 产品(如SQL Developer 等)的截图受以下Oracle 声明的约束:Copyright ? Oracle 及其关联公司。已获授权使用。第三部分使用的SQL 脚本取自GitHub,网址为 https://github.com/oracle-samples/db-sample-schemas,受以下Oracle 声明的约束:Copyright ? 2019 Oracle。IntelliJ IDEA 的截图受以下声明的约束:Copyright ? 2022 JetBrains s.r.o.,已获授权使用。JetBrains IntelliJ IDEA 和IDEA 的logo 是JetBrains s.r.o. 的注册商标。O’Reilly 在线学习平台(O’Reilly Online Learning)近40 年来,O’Reilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。公司独有的专家和改革创新者网络通过O’Reilly 书籍、文章以及在线学习平台,分享他们的专业知识和实践经验。O’Reilly 在线学习平台按照您的需要提供实时培训课程、深入学习渠道、交互式编程环境以及来自O’Reilly 和其他200 多家出版商的大量书籍与视频资料。更多信息,请访问网站:https://www.oreilly.com/。联系我们任何有关本书的意见或疑问,请按照以下地址联系出版社。美国:O’Reilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中国:北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)奥莱利技术咨询(北京)有限公司O’Reilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网页位于https://oreil.ly/resilient-oracle-plsql。要了解更多 O’Reilly 图书、培训课程和新闻,请访问https://oreilly.com。我们的Facebook:http://facebook.com/oreilly。我们的Twitter:http://twitter.com/oreillymedia。我们的Youtube:http://youtube.com/oreillymedia。致谢我的编辑Corbin Collins 指导了这个项目,并在许多棘手问题上为我提供了建议,比如如何以不同的方式处理本书的印刷版和电子版的链接。谢谢你,Corbin !在写作阶段,我很高兴与Kristen Brown、Katherine Tozer、Catherine Dullea 合作。Katie 和Kate 用务实的创造力和良好的判断力把我的图表整理得井井有条。在此期间,我还学到了很多关于图像分辨率和印刷尺寸的知识!谢谢你们,Kristen、Katie、Kate。我还要向Karen Montgomery 致以深深的谢意,感谢她漂亮的封面插图。Andy Kwan 是我与O’Reilly 的第一位联系人,他从一开始就坚信这本书的价值。特别要感谢Patrick Barel,他对每一章都做了深入的技术审查。Patrick 指出了一些关键的编码错误和不少技术问题。多谢你分享的知识和经验,Patrick。Michael McLaughlin(获得了Oracle Ace Pro 认证)也给出了有益的技术反馈。谢谢你,Michael,感谢你对SQL Developer 的处理方式和功能描述的深思。最后,同样的感谢要送给技术审查团队的Sayan Malakshinov。Sayan 提供的反馈既出色又飞快,为本书加入了很多有用的补充。我要向Mark Schreier 和他在Oracle Trademark & Copyright Legal Group 的团队表达我的感激之情,谢谢他们允许我使用Oracle 拥有的屏幕截图。获得许可的请求秒速通过。还要感谢Oracle Global Communications 的Travis Anderson,是他帮我联系到了Mark 的团队。网络的魔力使我在撰写本书第Ⅲ部分时结识了Ben Brumm。Ben 慷慨的允许我使用他优秀的SQL 脚本来安装Oracle HR 模式。
|
|