一、什么是“存储过程”?
存储过程(Stored Procedure)是指为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户可通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行。
存储过程在数据库技术中属于一种服务端编程方式,是一组预编译的SQL语句集,常用于对数据库进行操作、控制和管理。存储过程通常包括流程控制语句、数据操作语句、变量的定义和赋值、条件判断语句等,可以在执行过程中接受参数输入,并返回查询结果。
二、存储过程的特点
存储过程是一些SQL语句和控制语句组成的被封装起来的过程,它们可以在数据库中被客户端应用程序调用,并且可以包含变量、参数和存储函数等。存储过程驻留在数据库中,可以被视为数据库中的一个对象,它们可以被创建、修改和删除。
存储过程具有以下几个特点:
- 封装性:存储过程是由SQL语句和控制语句组成的过程,它们被封装在一起,形成了一个独立的对象,这样可以方便客户端应用程序调用。
- 可重用性:存储过程可以被多个客户端应用程序重复使用,因为它们是预编译的,可以在多个应用程序之间共享。
- 可编程性:存储过程是可编程的,可以由用户通过SQL语句和控制结构来定义和修改,从而实现对数据库的操作。
- 安全性:存储过程是在数据库中创建和保存的,因此可以增加数据库的安全性。只有受权的用户才能调用存储过程,避免了SQL注入攻击等安全问题。
像银行这类系统,通常会采用商用的数据库 Oracle、DB2 等,应为这些供应商有着完整的解决方案,可以帮助银行规避大量的风险。银行的一些外围业务会使用一些国产的分布式数据库或者 MySQL 这样开源的数据库。
银行是以数据为核心,且早期银行在建设业务的时候,没有好的国产数据库,所以采采购了 Oracle、DB2 这样有成功经验的的数据库。且每套数据库都有着自己的一套存储过程开发方式,只要掌握了存储过程的开发技巧,对数据的交互过程是没有问题的,对于前端使用 go、java、c++ 才是第二关心得问题。
三、阿里巴巴Java开发手册中禁止使用存储过程的原因是什么?
阿里巴巴Java开发手册中禁止使用存储过程的原因是,存储过程是一种复杂的SQL语句,使用存储过程可能会导致代码变得复杂,难以维护和扩展。此外,存储过程的使用也可能会导致性能问题,因为它们需要执行多个SQL语句,而这些语句可能会在数据库中进行复杂的查询和更新操作。
相比之下,使用Java中的JDBC API可以更方便地执行SQL语句,并且可以更好地控制SQL语句的执行过程。JDBC API提供了一些方便的方法来执行SQL语句,例如PreparedStatement和CallableStatement,这些方法可以更好地控制SQL语句的执行过程,并且可以更好地处理异常情况。
因此,阿里巴巴Java开发手册中禁止使用存储过程,而是鼓励使用JDBC API来执行SQL语句。
四、银行使用“存储过程”
银行等金融机构对于数据的安全性和一致性要求非常高,因此他们通常倾向于使用存储过程来处理数据。
通过存储过程,可以将重要的业务逻辑和数据操作封装在数据库中,这样可以确保所有数据操作都是统一的,并且可以更好地控制数据的访问权限。
五、互联网弃用“存储过程”
但是,在互联网应用中,存储过程却逐渐被弃用的一个原因是因为它们在实现上不够灵活。
存储过程将业务逻辑和数据操作绑定在了一起,一旦业务逻辑发生变化就需要修改存储过程,这样会导致代码的维护和升级变得非常困难。
此外,在现代应用中,通常采用的是分布式架构,而存储过程常常需要运行在数据库服务器中,无法充分利用分布式架构的优势。因此,在互联网应用中,往往使用ORM(Object Relational Mapping)框架或其他技术来代替存储过程。这些技术将业务逻辑和数据操作分开,可以更好地支持系统的快速迭代和扩展。
六、总结
一线互联网公司严禁使用存储过程的原因有多个方面:
- 可维护性和调试困难:存储过程的逻辑通常复杂且难以调试,特别是在遇到问题时,定位问题的过程可能会非常麻烦。
- 数据库迁移困难:如果需要从一种数据库迁移到另一种数据库(例如从Oracle迁移到MySQL),存储过程可能需要重写,这会带来大量的工作量和风险。
- 管理困难:随着存储过程的增多,管理可能会变得非常混乱,给维护工作带来极大的不便。
- 优化和维护成本高:随着业务的发展,数据库的表结构可能会发生变化,这些变化需要同步到存储过程中。此外,原本的SQL语句的执行计划可能不再是最优的,也需要重新维护。
- 分布式场景的问题:在分布式场景下,存储过程可能无法很好地处理数据分片的问题。例如,水平分表的情况下,存储过程可能无法处理所有数据的分析结果。
- 影响数据库性能:存储过程可能会增加数据库的压力,特别是在数据库SQL层面,可能导致处理速度变慢。
综上所述,尽管存储过程在某些情况下可能有一定的便利性,但考虑到一线互联网公司对于可维护性、可扩展性、性能等方面的高要求,严禁使用存储过程成为一种合理的选择。这些公司更倾向于将业务逻辑放在应用程序中,以便更好地适应变化、方便管理和优化。