java存储过程是什么_你为什么还在用存储过程?

news/2025/2/25 8:04:28

菜菜哥,我新接手了一个项目,看的我头疼呀

ae857ca3aef300573f3605439e2d030f.png 79872d3bc8b518ed917b77035d7fd076.png

业务有这么复杂呀?

de5bad856b0bda9b19ba681d8e9428eb.png e24a2dc586ea17473dd46a88ad4559c0.png

不是的,这个老项目完全是用存储过程写的,每个存储过程都好几百行

ae857ca3aef300573f3605439e2d030f.png 79872d3bc8b518ed917b77035d7fd076.png

这样呀,是够头疼的~

de5bad856b0bda9b19ba681d8e9428eb.png e24a2dc586ea17473dd46a88ad4559c0.png

有没有办法帮我了解业务一下?

ae857ca3aef300573f3605439e2d030f.png 79872d3bc8b518ed917b77035d7fd076.png

碰到这样的情况,我真帮不了你了,你可以多埋怨几句做的那个人~~~

de5bad856b0bda9b19ba681d8e9428eb.png e24a2dc586ea17473dd46a88ad4559c0.png 258b378e52613651f9e2a54710f07b67.png 3893e5f7b5fd12949a5787b76ff5f603.png存储过程 3893e5f7b5fd12949a5787b76ff5f603.png cae1190240b8584f487fa6daeb410c75.gif

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

优势

cae1190240b8584f487fa6daeb410c75.gif

1. 可以减少程序在调用DB时候的信息传输量(其实减少的只有Request的时候)

2. 存储过程是预先优化和预编译的,节省每次运行编译的时间,所以一般情况下认为存储过程的性能是优于sql语句的。

3. 对调用者可以隐藏数据库的复杂性,将数据组装的过程封装。

4. 参数化的存储过程可以防止SQL注入式攻击,而且可以将Grant、Deny以及Revoke权限应用于存储过程。

5. 如果业务开发中,数据人员和业务代码人员是分离的,业务人员可以不用关心数据,直接调用存储过程,更加面向分层开发设计理念。

劣势

cae1190240b8584f487fa6daeb410c75.gif

1. 存储过程这种“一次优化,多次使用”的策略节省了每次执行时候编译的时间,但也是该策略导致了一个致命的缺点:可能会使用错误的执行计划。

2. 存储过程难以调试,虽然有些DB提供了调试功能,但是一般的账号根本就没有那种权限,更何况线上的数据库不可能会给你调试权限的,再进一步就算能调试效果也比程序的调试效果要差很多。

3. 可移植性差,当碰到切换数据种类的时候,存储过程基本就会歇菜。

4. 如果业务数据模型有变动,存储过程必须跟着业务代码一起更改,如果是大型项目,这种改动是空前的,是要命的。

3893e5f7b5fd12949a5787b76ff5f603.png不推荐存储过程 3893e5f7b5fd12949a5787b76ff5f603.png cae1190240b8584f487fa6daeb410c75.gif

以上存储过程的优缺点,你随便一下网络就可能查到,表面看来存储过程的优势还是不少的,这也说明为什么老一辈程序员有很多喜欢写存储过程。但是随着软件行业业务日益复杂化,存储过程现在在复杂业务面前其实有点有心无力。

菜菜在业务中并不推荐使用存储过程,辩驳请留言。

4e81736f50b24eb2740c1ffe4c8f11f6.png cae1190240b8584f487fa6daeb410c75.gif

1. 采用存储过程操作数据在网络数据量传输上确实比直接使用sql语句要少很多,但这通常并不是操作数据系统性能的瓶颈,在一次操作数据的过程中,假设用时100毫秒,采用存储过程节省数据传输时间0.5毫秒(就算是5毫秒),我觉得这点时间基本可以忽略。

2. 存储过程是只优化一次的,这有时候恰恰是个缺陷。有的时候随着数据量的增加或者数据结构的变化,原来存储过程选择的执行计划也许并不是最优的了,所以这个时候需要手动干预或者重新编译了,而什么时候执行计划不是最优的了这个平衡点,预先无法知晓,这就导致了有些应用突然会变慢,程序员处于懵逼的状态。

3. 存储过程确实可以对调用方隐藏数据库的细节,但是这种业务代码人员和数据库设计人员是两个团队的情况又有多少呢,如果真是两个团队,那业务就需要两个团队来理解和沟通,我想沟通的成本也一定很高,而且分歧更容易产生。

菜菜认为数据库就应该做它最擅长的事情:存储相关。我不止一次的看过把业务写在存储过程的情况,程序代码层面真是薄薄的贫血层,就是一个数据的透传。我不赞同这种写法,因为我就接手过这样的程序,令我头疼的不是业务,而是看着好几千行的存储过程熟悉业务,关键还没有调试的权限(线上更不能调试)。

一个业务系统的设计往往需要你从数据库的层面抽离出来,把主要精力放在业务模型的设计上,在程序层面体现业务逻辑,而不是把业务逻辑都交给数据层面的管理者。前几天我排查过一个“Bug”:存储过程是输入参数是一个主键id的列表字符串,长度居然是 nvarchar(max),主要功能是根据id列表查询数据。我想说的是就算你是max的长度,也有超长的可能性发生,因为业务方传输什么参数,参数什么长度是你DB无法控制的,所以这类的业务一定要放在程序中做处理,而不是怀着侥幸心里丢给DB。

如果是抱着存储过程性能高的心态的话,我倒是觉得你这是误入歧途,菜菜认为存储过程从来都不是提高性能的关键,反而系统的架构,缓存的设计,数据一致性更是系统关键问题。

存储过程通常是一种解决方案,但是通常情况下不是唯一的解决方案,在选择存储过程作为方案前,请确保他们是正确的选择。

最后秀一波存储过程吧

d42438beb7e6bc90e2f2772055b24a57.gif

e15d56e1cdd25c58619ec3e1dadfe802.png

33036f78ada2cd0ec6b28d4133ee4af0.png

ced186f1187b3072db59c06bfcdc643d.gifTHE END 80d2d5d9916f323ede136119b0a58dde.png

五、其他看法

除了本文作者的观点之外,小编还给大家整理了一下其他关于是否要使用从存储过程的观点:

观点一:

76e25aa471b7a62a1b479d3a535ac6f0.png

观点二:

6be5b5fb271cedefce47bfbe44a56247.png

观点三:

2a0f5a12d48dbc804afcaf4dadb5be34.png

观点四:

c13305dfe540301dea816d59648ef8c4.png

观点五:

58675421023570792deead0c2ce646e1.png

观点六:

85a83327ae5909b23d16a6b761d502bb.png

观点七:

94ea2ad534ffc3bf222f7dce14614f00.png

观点八:

0c2e396881e817977bf30cbe9e4cf254.png


http://www.niftyadmin.cn/n/712027.html

相关文章

MyBatis——主配置文件的相关内容、使用PageHelper插件进行分页查询

文章目录: 1.MyBatis主配置文件 1.1 主配置文件中标签的编写顺序 1.2 使用数据库属性配置文件(包含properties标签) 1.4 settings标签(设置日志) 1.5 typeAliases标签(设置别名,不推荐使用…

ML_Review_PCA(Ch4)

Note sth about PCA(Principal Component Analysis)   ML6月20日就要考试了,准备日更博客,来记录复习一下这次ML课所学习的一些方法。 博客是在参考老师的ppt,以及戳这里,学习播客之后完成的,主要运用ppt的公式&#…

linux C(hello world)

1.使用vi/vim进行编写代码并保存为hello_world.c.如下&#xff1a; /* This is my first C program*/ #include <stdio.h> int main(){printf("Hello World!\n");return 0; }2.使用gcc进行编译 gcc hello_world.c -o hello_world 3.像执行shell脚本一样执行 ./…

Python setup.py和MANIFEST.in文件

Setup.py文件 from setuptools import setup from codecs import open# 第三方依赖包及版本号 requires [beautifulsoup4>4.3.2,gearman>2.0.2,pymongo>2.7.2,threadpool>1.2.7,geoip2>2.1.0,pywin32>219]# 包列表 packages [MSE,MSE.Device,MSE.Proxy,MSE…

常用技巧_莫德里奇常用的三个过人技巧

大家好&#xff0c;今天我们学习莫德里奇常用的三个过人摆脱技巧&#xff0c;希望大家喜欢&#xff01;今天学习的三个技巧都是莫德里奇在比赛中常用的三个技巧&#xff0c;技巧不难&#xff0c;但很实用&#xff0c;下面我们开始学习&#xff01;第一个技巧&#xff1a;第一个…

Spring——框架概述(概念理解)

文章目录&#xff1a; 1.什么是Spring框架&#xff1f; 2.Spring的优点 2.1 轻量 2.2 针对接口编程&#xff0c;解耦合 2.3 AOP编程的支持 2.4 方便集成各种优秀框架 3.Spring的体系结构 1.什么是Spring框架&#xff1f; Spring 是于 2003 年兴起的一个轻量级的 Java …

linux命令设计,设计模式学习之——命令模式

定义&#xff1a;命令模式&#xff1a;将一个请求封装为一个对象&#xff0c;从而使你可用冉的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持课撤销的操作。UML&#xff1a;命令模式涉及到五个角色&#xff0c;它们分别是&#xff1a;客户端(…

Android Studio断点调试

Android Studio断点调试 Android Studio包含一个debugger程序,可以帮助你在模拟器和真机上调试你的android应用.通过Android Studio的debugger,你可以: 选择你想调试的设备.在代码上设置断点.在运行时去检查变量和表达式的值.可能平时大家调试代码都是通过打印log的形式,今天带…