为什么阿里巴巴禁止使用存储过程?

【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南 【Docker】掌握 Docker魔法:Windows 11 平台上的完美容器部署终极指南 一文搞懂什么是 Docker?分析容器的工作原理、容器的架构、Docker的优势、使用 Docker的原因。 全程手把手教你Docker的安装与使用,配置阿里云镜像加速、容器常用命令! 阅读详情


作者 | 杨洋的围脖啊

来源 | segmentfault.com/a/1190000011138993

之所以有这个题目,我既不是故意吸引眼球,也不想在本文对存储过程进行教科书般论述。《阿里巴巴Java开发手册》是这样规定的:


再结合我最近项目中遇到的存储过程问题,所以今天我打算来聊一聊这个问题。

这事儿要从去年在武汉出差时一位同事的发问说起,问题是这样的:

我觉得存储过程挺好用的,你为什么不建议用呢

当时我好似胸有万言,但终究没用一个实在的例子回答同事,只是从结论上大侃一通,代码相对于SQL,复用、扩展、通用性都要更强。想必同事并不信服。

现在想来,我最近正碰到的问题,算是一个可以回答同事的例子吧。

最近项目中有个新需求,需要校验一个用户是否有Job,Certification,Disclosure这三个业务数据。

翻看了代码发现,系统的用户个人页面的C#代码调用了三个存储过程,去抓取用户的Job,Certification,Disclosure数据。

我的新需求,自然需要复用这三个存储过程,否则:

若每一处都写一次抓取数据的业务逻辑代码,若业务逻辑发生变化,难以追查和维护所有读取Job,Certification,Disclosure的SQL。

如果我在C#代码中调用这已有的三个存储过程,事情本该非常快就能结束。我也是这么做的。

但code reviewer认为,我的需求中,并不需要Job,Certification,Disclosure这三个业务对象的数据。我只是需要给定用户是否有Job,Certification,Disclosure而已。所以我应将是否有无Job,Certification,Disclosure的判断逻辑写在数据库,最终通过网络从数据库传到web服务器的仅是true或false,节省网络流量,这样最好不过了。

也对。除开网络性能,从接口设计的角度讲,接口的传入和返回值,都应是你本身需要的数据,不应带有大量不需要或者需要caller去预处理的数据。从接口语义表达就可知调用的目的,这样代码可读性也会有大大提高。

那就动手改。但没想到的是问题来了。

为了讲述问题,我简化代码,假设系统现有的存储过程如下:


CREATEPROCEDURE [dbo].[GetJobs]
(
@PersonId int,
@OrganizaitionId int
)
AS
BEGIN
SELECT JobId,JobName,JobType FROM Job WHERE PersonId = @PersonId AND OrganizaitionId = @OrganizaitionId
END

我在新的存储过程中调用它,我需要获得该person的jobs的数量,即GetJobs返回结果集的count。

为了实现这一目的,首先想到的是使用临时表,将返回结果集存入临时表,再对其进行count(*)的计数操作:

CREATEPROCEDURE [dbo].[MyProc]
(
@PersonId int,
@OrganizaitionId int,
)
AS
BEGIN
CREATETABLE#Temp(
PersonId int,
OrganizaitionId int
)

INSERTINTO#Temp EXEC dbo.GetJobs
@PersonId = @PersonId,
@ParentOrgId = @ParentOrgId

SELECTCOUNT(*) FROM#Temp
END

这种办法简单有效,但它存在严重的维护问题。未来如果被调用的存储过程的返回结果集字段有变动,那么MyProc中的临时表结构也需要随之变化。这是令人难以接受的。

那么将MyProc中的INSERT INTO换为SELECT INTO呢?很遗憾,答案是不行。SQL本身并不支持这种用法。

给现有存储过程GetJobs加output参数?本例中因为GetJobs已被其他多处代码或SQL scripts调用,所以对现有现有存储过程进行改动会有不小风险。

我搜遍网络,一位MS MVP的大神的文章几乎总结了所有存储过程之间传递数据的方法: How to Share Data between Stored Procedures。他在文章中也无可奈何地说道

Keep in mind that compared to languages such as C# and Java, Transact-SQL is poorly equipped for code reuse, why solutions in T‑SQL to reuse code are clumsier.

最终我没能找到一种满意的办法,无奈之下我在新写的存储过程中将查询Jobs的语句写一了次。

存储过程在很多场景时有其优势,比如性能。但对于业务逻辑的通用方法,非常不推荐将其写在存储过程中,代码复用、扩展与客户端语言比,相差甚远。也许终究能实现,但代价与风险比客户端语言要高,得不偿失。

天知道还有没有机会和那位前同事再讨论这一话题呢。

最后,推荐给大家一个干货有料的公众号:JavaCat,该号没有广告,天天都是干货,老Java带你做项目实践,永不迷路:

长按关注,学习Java
C#量化交易的市场数据采集与分析:从0到1构建你的‘数据雷达’——对比5大神器,代码实战全解析! 数据是量化交易的‘氧气’,而好的数据采集与分析是你的‘呼吸机’!本文5大神器+代码实战,总有一款适合你!(本文代码均经过测试,但请根据实际需求调整! 阅读详情

相关推荐

ABP框架实战:从零搭建多租户应用(含完整代码示例)

本文详细介绍了如何使用ABP框架从零构建多租户SaaS应用,涵盖多租户架构设计、数据隔离实现、租户管理及性能优化等核心内容。通过完整的代码示例,帮助开发者快速掌握企业级数据隔离系统的开发技巧,提升SaaS应用开发效率。

weixin_29247219的博客 263

传说阿里禁止使用存储过程?

针对存储过程优缺点的讨论(争论)由来已久,这里我们不妨来详细盘点一下存储过程的利与弊。先说优点毕竟还是有不少人在用,总要有点好处。SQL 过程化很少人提及存储过程的这个优点,似乎是认为理所...

Java技术栈,分享最主流的Java技术 1528

Data+AI新玩法:Text2SQL让数据查询变得如此简单!

你是不是也遇到过这种情况?明明手头有海量数据,却因为SQL这道“门槛”,让分析和决策变得复杂和拖沓。你可能想着:“要是我能直接用自然语言和数据库对话,那该多好!你不是一个人在这样想,Text2SQL技术正是为了帮你摆脱这一困境而诞生的。

Ase5gqe的博客 865

How to Share Data between Stored Procedures

Introduction This article tackles two related questions: How can I use the result set from one stored procedure in another, also expressed as How can I use the result set from a stored procedure i...

weixin_34406086的博客 1202

从实验室到晶圆厂:一文看懂二维半导体(如MoS2)的CVD生长与晶体管制造挑战

本文深入探讨了二维半导体(如MoS2)从实验室研究到晶圆厂量产的CVD生长与晶体管制造关键技术挑战。重点分析了晶圆级二维半导体的CVD生长工艺优化、晶体管制造的四大界面工程难题,以及掺杂与集成的产业化解决方案,为二维半导体在集成电路领域的应用提供技术参考。

weixin_42651748的博客 472

Keil AC6编译器独立安装与配置指南:不升级Keil MDK也能用上新工具链

本文详细介绍了如何在不升级Keil MDK的情况下独立安装和配置Arm Compiler 6(AC6),帮助嵌入式开发者充分利用AC6的编译速度、代码密度和现代语言支持优势。通过零侵入式解决方案,开发者可以在现有环境中灵活切换编译器版本,提升开发效率。

weixin_30872157的博客 552

阿里巴巴禁止使用存储过程?为什么存储过程在互联网时代失宠了!

存储过程,简单来说,就是预编译的SQL语句集,存储在数据库中,可以被客户端应用程序调用。它像是一把数据库中的“瑞士军刀”,能完成各种复杂操作。存储过程有着辉煌的历史。在C/S架构盛行的时代,它是绝对的明星。数据库不仅承担数据存储、计算功能,还要运行很重的业务逻辑,相当于同时承担应用服务器的大多数功能。存储过程的主要特点:封装性、可重用性、可编程性和安全性。乍一看,这简直完美!但正是这把“瑞士军刀”,在互联网时代却变成了“烫手山芋”。阿里巴巴禁止使用存储过程,本质上是工程化考虑优于单纯技术特性的选择。

热爱技术、喜欢学习、乐于分享 1082

基于STM32的智能水温控制系统设计

智能水温控制系统广泛应用于家庭、工业、农业等多个场景,尤其在热水器、恒温泳池和地暖系统中,通过实时监测和调节水温,提高设备的效率和用户的舒适度。本文基于STM32微控制器设计了一个智能水温控制系统,能够实时监测水温、用户设置温度,并根据需要控制加热器或冷却装置,确保水温维持在设定范围内。系统能够根据用户设定自动控制加热和冷却设备,确保水温维持在舒适的范围内,并通过OLED屏实时显示水温信息。在生成的项目基础上,编写水温监测、目标温度设定、加热器和冷却装置控制、OLED数据显示以及超温报警的代码。

2401_88410555的博客 2475

阿里巴巴为什么要禁止使用存储过程?

但code reviewer认为,我的需求中,并不需要Job,Certification,Disclosure这三个业务对象的数据。除开网络性能,从接口设计的角度讲,接口的传入和返回值,都应是你本身需要的数据,不应带有大量不需要或者需要caller去预处理的数据。翻看了代码发现,系统的用户个人页面的C#代码调用了三个存储过程,去抓取用户的Job,Certification,Disclosure数据。我在新的存储过程中调用它,我需要获得该person的jobs的数量,即GetJobs返回结果集的count。

Wewe的博客 1088

自定义LayoutManager实现android-pile-layout滑动卡片堆叠效果

这是我的第一篇博客,总算有个契机开始写博客了,就从自定义LayoutManager开始吧。 前段时间看到一个项目(android-pile-layout),效果特别不错,这是效果图: 效果确实不错,我看了下实现,是用的自定义的ViewGroup实现的,计算什么还搞的挺复杂的,具体的没细看。作者说也尝试过用LayoutManager实现,但是没找到合适的数学模型,好吧,看到数学模型我

u014296305的博客 1万+

2021-8-14 EDK II编译

2021-8-14 EDK II 编译为什么要写这篇文章新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 为什么要写这篇文章 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo

qq_45775660的博客 2946

mysql 禁止存储过程_为什么阿里巴巴禁止使用存储过程?

点击关注上方“SQL数据库开发”,设为“置顶或星标”,第一时间送达干货本文作者:杨洋的围脖啊链接:segmentfault.com/a/1190000011138993之所以有这个题目,我既不是故意吸引眼球,也不想在本文对存储过程进行教科书般论述。《阿里巴巴Java开发手册》是这样规定的: 再结合我最近项目中遇到的存储过程问题,所以今天我打算来聊一聊这个问题。这事儿要从去年在武汉出差时一位同事的...

weixin_28936865的博客 867

CLAHE 算法学习 matlab

概念可参考: CLAHE (Contrast Limited Adaptive Histogram Equalization)算法学习CLAHE具体实现主要包括6个步骤。1):分块。将输入图像划分为大小相等的不重叠子块,每个子块含有的像素数为M。参考示例为8×8块。 2):计算子块直方图。 3):计算剪切阈值clipLimit 4):像素点重分配。对每个子块,使用步骤三中多余的像素重新分配。 5):直方图均衡。 6):像素点灰度值重构。(源码中采用了双线性插值) http://www.realtimer

baidu_34971492的博客 4253

为什么阿里巴巴Java开发手册禁止使用存储过程?

虽然存储过程在某些场景下可以提高性能和安全性,但其可维护性、可移植性、性能、安全性和开发效率等方面的问题使得阿里巴巴Java开发手册建议禁止使用存储过程。在实际开发中,应根据具体需求和场景选择合适的数据库操作方式。

xycxycooo的博客 1013

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

上一篇: 为什么牛逼的程序员都不用 “ ! = null " 做判空?
下一篇: 牛逼!来了一个 Java 神器
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值