我正在努力保持在我们公司使用存储过程。有一些人说他们很糟糕,我们不应该使用它们。我们在i系列上使用DB2。
请帮助我的论点,让我公司保存存储过程。
答案 0 :(得分:10)
你不会喜欢这个,而且我可能会被遗忘,但我和你的其他人一起。
存储过程用于提供许多好处(安全性,性能等),但是通过参数化查询和更好的查询优化,存储过程实际上只是为应用程序添加了另一层开销,并为您提供了更新/修改所需的其他位置代码。
我更喜欢将所有内容保存在一个位置,这样当我需要编辑代码时,我可以去一个地方并在那里进行更改。
如果您想了解有关远离Stored Prcoedures的论据的更多详细信息,请查看此CodingHorror文章:
Coding Horror: Who Needs Stored Procedures Anyway?
......我刚才注意到这篇文章是从2004年开始的。我不得不相信数据库从那时起已经变得更好了,这意味着今天的数据会比以前更加真实。
答案 1 :(得分:2)
通过JDBC执行所有操作本质上意味着您在您和数据库之间插入网络层。总而言之,这意味着数据更“远程”并且速度更慢。存储过程可以直接处理数据库内部的数据,由此产生的速度差异可能会使您感到惊讶。
请注意,如果是程序技能问题,您可以使用任何IBM i语言(包括Java)编写存储过程。此外,您可以访问FULL机器,而不仅仅是一些数据库内部。在这里,AS / 400与其他任何数据库产品都有很大的不同,其他数据库的经验 - 我的意见 - 不适用。
我会推荐Midrange邮件列表,因为他们拥有我所知道的最大AS / 400编程技能。
答案 2 :(得分:2)
这是Marmite问题之一。如果您主要是数据库程序员,您会认为应该广泛使用存储过程。如果您是应用程序员 - 比如Java或.Net编码器 - 您可能会说应该完全避免它们。
这不符合应用程序程序员想要编写自己的SQL语句。不,现在他们倾向于抽象出令人费解的ORM服务背后的一切。这些比存储过程更容易理解,但在同一IDE中可用,因此它们需要较少的上下文切换。
支持存储过程有两件大事。首先,知道PL / SQL的人可能熟悉Oracle数据库(T-SQL和SQL Server等),因此倾向于为该数据库编写更好的程序(定义为利用该数据库的程序)平台的功能,并适合其功能)比没有。
第二件事是数据仍然存在。应用程序开发人员喜欢谈论“数据库独立性”,但真正重要的是应用程序独立性。前端来去匆匆,但数据模型永远存在。在过去的十年中,Java应用程序被编写为Applet,Servlet,JSP,Tiles和Faces,以及JavaScript,Groovy,AJAX和JSON中的附加组件,通过手动JDBC,EJB(v1,2, 3),TopLink,Hibernate和IBatis ......如果我错过了一些,请原谅我。 UI优先于存储过程层的应用程序更容易升级到最新且最好的应用程序,每次都必须重写业务逻辑。而且他们也会表现得更好。
然而,从长远来看,直接与数据库交互的应用程序可能会消失。一切都将与服务总线对话,这将决定从何处获取数据。当然,通过精心设计的存储过程API公开数据库的商店可能会发现,移动到这个勇敢的新世界比那些必须从ORM逻辑中提取所有内容的地方更容易。
答案 3 :(得分:1)
当您拥有一组分层的应用时,它们非常有用。例如,具有提供原子操作(恰好是存储过程)的Web服务的单核心DB和消耗这些WS的ESB或一组应用程序。 在单app / single-db案例中,我们的想法是将代码保存在其他人建议的位置。
但是,那只是我。
答案 4 :(得分:1)
我是一名长期的Java开发人员,他最近遇到了一些项目,这些项目大量使用了存储过程,这些存储过程使得存储过程的使用对我来说非常糟糕。
话虽如此,我不愿全面声明存储过程作为系统设计选项是不好的,因为实际上它取决于所涉及的项目以及特定存储过程试图完成的内容。
我的偏好是避免使用任何类型的存储过程来进行简单的CRUD操作(对于某些存储过程来说处理这些操作可能听起来很可笑,但我遇到了几个正在执行此操作的系统) - 最终导致必须在Java端编写(并测试和维护)许多代码,以便从我观察到的内容中管理这些过程调用。最好只使用Hibernate(或其他一些ORM库)来处理这些类型的操作......如果没有其他原因,它往往会减少需要维护的代码量。当尝试重构或对系统进行任何重大更改时,它也会导致问题,因为您不仅需要关注类/表更改,还需要关注处理CRUD操作的存储过程。如果您处于开发人员无法自行更改数据库的情况,或者存在一些正式的流程来协调系统两个部分之间的更改,这可能会进一步恶化。
另一方面,拥有需要与Java代码进行有限交互的存储过程(基本上,你只需要激活一个带有一些参数的调用),并以半自治的方式运行也不是一件可怕的事情。 。我遇到过一些情况(特别是在我们将数据迁移或导入系统的情况下),使用存储过程比编写一堆Java代码来处理功能要好得多。
我想这里的真正答案是你应该检查系统中当前每个存储过程正在做什么,并根据具体情况对它们进行评估,以确定是否可以更容易地处理Java中的操作或数据库。有些人可能在Java中工作得更好(通过ORM库或实际的手写代码),有些可能没有。在任何一种情况下,目标应始终是确保系统易于理解并易于维护,而不仅仅是存储过程本身的好坏。
答案 5 :(得分:1)
好的,我会支持存储过程。
首先,如果您单独使用它们,它们会使数据库的重构变得更加简单,因为您可以使用存储在数据库中的依赖项来查找更改会受到影响的内容(无论如何,SQL Server中都不能代表其他内容) datbases)。
其次,如果您只需更改查询,则部署起来要简单得多。
它们也更容易调整性能,因为它们可以在不启动应用程序的情况下轻松调用。
如果您有复杂的逻辑,那么您不必通过网络将所有内容发送到数据库服务器,从而节省了一些性能。可能看起来不是一个很大的收获,但如果复杂的查询每天运行数千次,它可以加起来。
安全性也非常重要。如果不使用存储过程,则必须在表或视图级别设置权限。这会将数据库打开为内部欺诈。是的,参数化查询可以降低sql注入的风险,但这并不是您需要防范的唯一威胁。如果您有个人或财务数据,并且您没有使用存储过程(以及没有动态SQl的过程)并限制您的用户只能通过过程执行操作,那么您的系统将面临极其危险,因为内部员工可以窃取数据或绕过内部控制来窃取资金。阅读会计准则中的内部控制,了解这是一个问题。
ORM还倾向于编写非常糟糕的SQL代码,尤其是在查询很复杂的情况下。此外,当人们开始使用它们而不是存储过程时,我发现从未使用过存储过程的人对如何从数据库中获取数据并且经常得到错误数据的理解较差。如果您已经了解SQL并且可以确定何时将自动生成的代码重写为更好的代码,那么使用ORM就可以了。但是太多的用户没有编写复杂代码的技能,因为他们从未学过基础知识。
最后因为你已经为你的应用程序存储了proc,所以完全摆脱它们是一种引入新bug的方法,因为你必须生成新的代码。