我战斗,以保持使用存储过程在我们的公司。有几个人说,他们谁是不好的,我们不应该使用它们。我们使用在i系列DB2。

请在我的论点,以保持存储过程的活在我公司的帮助。

有帮助吗?

解决方案

OK,我会支持存储特效的问世。

首先,如果你只使用它们,它们使得重构数据库更简单,因为你可以使用存储在数据库中的依赖关系,找出哪些将被改变(以及在SQL Server反正会受到影响,不能用于其他说话datbases)。

第二,如果你需要改变只是查询,他们就简单得多了部署。

他们也更容易进行性能调整,因为他们可以很容易地不费一枪了应用程序调用。

如果您有复杂的逻辑,那么你将不必把所有通过网络数据库服务器节省一些性能。似乎不是一个大的提升,但如果复杂查询运行数千次,每天可以积少成多。

安全也是非常重要的。如果你不使用存储过程,你必须设置在表或视图级权限。这打开了数据库为内部欺诈行为。是的,参数化查询减少SQL注入的风险,但这并不是你需要警惕的唯一威胁。如果有个人或财务数据,你不使用存储的特效(和那些没有动态SQL),并限制你的用户只能够通过特效做的事情,那么你的系统是由内部员工谁可以偷极度危险数据或旁路内部控制偷钱。阅读关于内部控制在占标准看出为什么这是一个问题。

奥姆斯也往往只写坏透顶SQL代码,特别是当查询是复杂的。而且因为人们开始转而使用它们存储特效的,我发现,从来没有谁使用存储的特效人们对如何获取数据从数据库中,并经常得到错误的数据较差的理解。使用ORM是好的,如果你已经了解SQL并能确定何时自动生成的代码改写成一些作品更好。但是,太多的用户不具备的技能,编写复杂的代码,因为他们从来没有学过的基础知识。

最后,因为你已经存储的特效为你的应用程序,让他们摆脱完全是becasue你不得不生成新的代码,以引入新的问题的一种方式。

其他提示

您会不会喜欢这一点,我可能会得到downvoted被人遗忘,但我与你的北美经销商休息。

用于提供许多好处(安全性,性能等),但与参数化查询和更好的查询优化存储过程,存储过程实际上只是增加开销的另一层到应用程序,给你你需要更新另一个地方/修改代码。

我喜欢保持在一个单一的现货一切,所以,当我需要编辑的代码,我可以去一个地方,让我改变那里。

如果您想了解有关参数的详细信息,根据存储Prcoedures移开,看看这个CodingHorror文章:

编码恐怖:谁需要反正存储过程?

...我只是注意到文章是从2004年开始我不得不相信,数据库已经得到从那以后更好这意味着这将响更是如此今天比它呢。

过JDBC尽一切本质上意味着要插入你和数据库之间的网络层。总而言之,这意味着数据更“远程”和来找你慢。存储过程可以直接在数据库中的数据的工作,并且在速度所得到的差可能你大吃一惊。

请注意,您可以编写存储过程在任何IBM i语言包括Java,如果它是程序设计技巧的问题。此外,您还可以访问完整的机器,而不只是一些数据库内部。在这里,AS / 400所以从任何其他数据库产品很大的不同,从其他数据库经验简单 - 在我的的意见 - 不适用

我会推荐中端的邮件列表,因为他们的AS / 400的编程技巧的最集中,我知道的。

这是这些Marmite的问题之一。如果你主要是一个数据库程序员,你会认为存储过程应广泛利用。如果你是一个程序员 - 说一个Java或净编码器 - 的机会,你会说,他们应该完全避免。

不,这满足应用程序的程序员要编写自己的SQL语句。不,这些天,他们往往要落后曲ORM服务抽象的一切。这些是不是存储过程来理解并不容易,但都是一样的IDE中可用,所以他们需要更少的上下文切换。

有利于存储过程的两件大事。第一,谁知道PL / SQL的人很可能是熟悉Oracle数据库(T-SQL与SQL服务器等),所以往往会写出更好的程序,该数据库(定义为搭平台的优势项目功能,并配其功能)比人谁不知道。

的第二件事情是该数据存在。应用程序开发人员都喜欢谈论“数据库的独立性”,但真正重要的是应用程序的独立性的。前端来来去去,但永远的数据模型长存。在过去十年中的Java应用程序已经被写成小程序,Servlet的,JSP的,瓷砖和面,用附加组件在JavaScript,Groovy中,AJAX和JSON,连接到通过手卷JDBC,EJB(V1,2数据库, 3),TopLink的,Hibernate和iBatis的......原谅我,如果我错过了一些。应用其UI是在存储过程的一层皮肤,更容易升级到最新和最伟大的不是应用在商业逻辑必须被重新编写的每一次。他们将更好地执行了。

然而,在长期运行的应用程序,它们相互作用直接与数据库都可能将消失。一切都会聊到服务总线,并会从那里获取数据决定。当然,这里的数据库是通过存储过程设计良好的API暴露的店铺可能会发现更容易移动到这个勇敢的新世界比那些将不得不提取一切他们的ORM逻辑的地方。

他们当你有一组分层的应用程序是有用的。例如,单核DB Web服务提供的原子操作(这恰好是存储过程)和ESB或一组应用程序消耗的WS上。 在单个应用内/单分贝情况下,这个想法是保持代码在一个地方如其他建议。

不过,嗯,这就是我。

我是一个长期的Java开发者谁最近跨大量使用的是已经把使用存储过程在一个非常糟糕的光,我的存储过程的几个项目来。

话虽如此,我不愿意做一个毯子声明,存储过程是糟糕的系统设计方案,因为它实际上取决于有问题的项目和有什么特殊的存储过程所要完成的。

我的选择是,以避免任何类型的存储过程进行简单的CRUD操作(这听起来很可笑有些已存储过程处理这些操作,但我遇到的几个系统已经在做这个) - 这最终导致在很多具有写入(以及测试和维护)在Java端来管理从我所观察到的这些程序调用的代码。这是更好地只使用Hibernate(或其他ORM库)来处理这些类型的操作......如果不是它趋向于减少代码需要的量没有其他原因得以维持。它也可以尝试重构时产生问题或作出任何显著改变系统,因为你不只是不必关心自己与类/表发生变化,但存储过程手柄CRUD OPS为好。这可以进一步,如果你在一个情况下开发商不能进行更改数据库本身而加重,或出现在适当的位置坐标系统的两个部分之间变更的正式流程。

在另一方面,具有存储需要与Java代码(基本上,你只火了一个与几个参数的调用)有限的交互过程,并在半自治的方式运行不是一件可怕的事情无论是。我遇到一些情况下(特别是当我们迁移或导入数据到系统),其中使用存储过程比写一堆Java代码来处理功能的更好途径。

我想真正的答案在这里将是你应该检查什么系统中的每个存储过程,目前正在做并评估他们对案件逐案基础上,以确定是否可能更容易处理Java或操作数据库。有些很可能在Java中(通过ORM图书馆,或实际手写代码)工作得更好,有些人可能不。在这两种情况下,我们的目标应该始终以确保该系统是可以理解的,易于维护的每一个人,而不仅仅是存储过程是好还是坏在自己的和。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top