关于我们
书单推荐
新书推荐
|
Oracle PL/SQL弹性实战 本书的主要内容有:在避免常见的PL/SQL反模式的同时构建可靠的PL/SQL解决方案。了解为什么将复杂的业务逻辑嵌入SQL往往是一个容易出问题的选择。学习如何识别和改进薄弱的PL/SQL代码。通过运行数据驱动的数据库内测试来验证PL/SQL代码。理解复杂PL/SQL系统的安全操作、维护、修改。学习思考特征而非只是用例的好处。 编辑推荐 前言关系型数据库依然是有史以来最成功的技术之一。多年来,关系型数据库面临了诸多挑战。例如,在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。本书旨在帮助你完成工作。一般来说,你可以在自己的程序或文档中使用本书提供的示例代码。除非需要复制大量代码,否则无需联系我们获得许可。例如,使用本书中的一些代码片段编写程序不用获得许可,销售或分发OReilly 图书的示例光盘则需要获得许可。引用本书中的示例代码回答问题不用获得许可,将本书中的大量示例代码放到产品文档中则需要获得许可。我们感谢但并不强制要求你在引用本书内容时标注出处。出处说明通常包括书名、作者、出版社和ISBN,例如:Resilient Oracle PL/SQL by Stephen B. Morris(OReilly). 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. 的注册商标。OReilly 在线学习平台(OReilly Online Learning)近40 年来,OReilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。公司独有的专家和改革创新者网络通过OReilly 书籍、文章以及在线学习平台,分享他们的专业知识和实践经验。OReilly 在线学习平台按照您的需要提供实时培训课程、深入学习渠道、交互式编程环境以及来自OReilly 和其他200 多家出版商的大量书籍与视频资料。更多信息,请访问网站:https://www.oreilly.com/。联系我们任何有关本书的意见或疑问,请按照以下地址联系出版社。美国:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中国:北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)奥莱利技术咨询(北京)有限公司OReilly 的每一本书都有专属网页,你可以在那儿找到本书的相关信息,包括勘误表、示例代码以及其他信息。本书的网页位于https://oreil.ly/resilient-oracle-plsql。要了解更多 OReilly 图书、培训课程和新闻,请访问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 是我与OReilly 的第一位联系人,他从一开始就坚信这本书的价值。特别要感谢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 模式。 Stephen B. Morris是一位独立作家和顾问,居住在爱尔兰。他在企业开发和网络应用领域拥有丰富的经验,从事专业代码编写工作已有30年之久,技术之旅涉及电信、金融、医疗保健、政府等多个行业。 目录
你还可能感兴趣
我要评论
|