`
hyhongyong
  • 浏览: 17477 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

把业务逻辑从存储过程中拿出来

阅读更多

对于业务逻辑放在存储过程中的情况,目前比较有市场的看法是: “不要把业务逻辑放在DB中,除非有性能问题”
日前,我却遇到另外一种情况:
首先说一下业务(简化过的):
酒店预订系统,酒店是按天计算价格的,酒店合同价格是按时间段的,后录的合同如果时间上与原来的重合,则使用后录合同的价格。
现在的问题是从酒店合同价格计算预订时间段内的价格。主要有三个步骤:
1.分割:把合同价格的时间段按天分割到每天的价格
2.选择:选择每天上比较后录的合同的价格
3.归并:按价格相同与否,将每天的价格归并成时间段
之前是用存储过程做的。(因为这样会减少网络传输),而且不是一个存储过程,因为不同的价格计算条件和方式有一些微小的差别。
很不幸,业务有变化了,这些存储过程都要改动,而且目前有了一些性能方面的问题:
我们的DB是用的oracle 10 的RAC,AP服务器用的是weblogic 8 集群。在计算所有酒店的一天价格时,用存储过程要10多分钟。如果计算多几天的价格,则会因为存储过程时间过长,造成AP报timeout。
为了应对业务的变化(也因为有了这些变化,才敢有以下的做法),也为了解决性能问题,我决定把这些业务逻辑从DB中移出来,放在程序中去。我们用面向对象的方法进行分析和设计,用若干业务领域类以及持久化DAO代替了这些存储过程。用了大约2个人月的时间,完成上线了。 计算一天价格的时间下降到3分钟,仔细检查了一下,业务接口中有个地方可以优化。优化后,计算一天价格的时间下降到不足一分钟了,多天的价格计算也可以进行了!
总结一下这次过程:
1、存储过程处理的过程复杂时,性能未必好!
2、程序中也有很多地方是可以优化的。
3、面向对象的程序应对业务逻辑的变化,有时比存储过程还要好!

分享到:
评论
21 楼 rtdb 2008-07-25  
〉优化后,计算一天价格的时间下降到不足一分钟了,多天的价格计算也可以进行了!

呵呵,还要将近一分钟啊。
我以为,这种每天的价格计算应该只算一次就够了,
结果入库即可。

客户查询时可直接获得价格,不需要再算了。
20 楼 0701 2008-07-25  
movingboy 写道
楼上的其中几位,说话请留点余地吧。

楼主愿意把他的体验说出来给大家分享,这是好事啊。或许他是不太清楚为什么,或许他的优化是有问题的,大家可以在技术上进行分析,帮助他把问题搞清楚嘛。如果只是用带打击、否定、不屑一顾的语气说话,楼主还会愿意与大家分享吗?各位又从讨论中收获了什么呢?

好吧,那你说说从中学到什么了?
这是在做性能优化吗?
他反正是自己都搞不清楚,要不你给他解释解释吧
19 楼 steven_652 2008-07-25  
应该是你存储过程写的有问题。

另外你用的是Oracle,不会存在存储过程锁表的问题。
18 楼 movingboy 2008-07-25  
楼上的其中几位,说话请留点余地吧。

楼主愿意把他的体验说出来给大家分享,这是好事啊。或许他是不太清楚为什么,或许他的优化是有问题的,大家可以在技术上进行分析,帮助他把问题搞清楚嘛。如果楼主感受到的只是打击和否定,他还会愿意与大家分享吗?各位又从讨论中收获了什么呢?
17 楼 ironsabre 2008-07-25  
我们的DB是用的oracle 10 的RAC,AP服务器用的是weblogic 8 集群。在计算所有酒店的一天价格时,用存储过程要10多分钟。如果计算多几天的价格,则会因为存储过程时间过长,造成AP报timeout。
-----------------------------------------------------------------------------
另一个问题:这儿应该用异步处理。
16 楼 0701 2008-07-25  
<div class='quote_title'>hyhongyong 写道</div>
<div class='quote_div'>关于存储过程,我们没有专门的DBA进行优化,我只能从自己理解的角度去思考一下: <br/>1、数据量:价格计算过程涉及到从4、5个表中取数据,其中有两个表的数据量较大(几百W)<br/>2、因为存储过程的技术限制,选择和归并是需要花些时间的。而程序可以优化这些过程<br/>3、DB表锁机制,存储过程占用表锁的时间相对长<br/>4、将时间长的存储过程时间,化了简单的DB表查询,压力转移到AP端(事实上压力对DB和AP优化前后都没有什么问题)<br/></div>
<p><br/>你自己DB优化的不好,就说存储过程不好?</p>
<p> </p>
<p>1、存储过程处理的过程复杂时,性能未必好! <br/>2、程序中也有很多地方是可以优化的。 <br/>3、面向对象的程序应对业务逻辑的变化,有时比存储过程还要好! </p>
<p> </p>
<p>这三点中的1、3是歪理,2是废话!</p>
15 楼 ironsabre 2008-07-25  
<div class='quote_title'>hyhongyong 写道</div>
<div class='quote_div'>把存储过程用java重写,并不是简单的重写。
原来存储过程的步骤,如果用java直接按那个思路写,效率可能会相当差。
只是用面向对象的方式重新实现一些存储过程的逻辑而已,至于性能的优化,在优化前我们并没有太大的把握,只是觉得性能出现问题了,DB上暂时又没有什么好办法可以提升(实际上我们也试了一些方法,比如存储过程中调试,加索引等但都没有实质提升),用java实现应该是一条路。</div>
<p> </p>
<p>你这不是优化,你是在玩。</p>
<p> </p>
<p>你在开始重写之前都不知道真正的问题出现在哪里。</p>
<p>我想你不也不知道为什么重写之后速度快了。</p>
14 楼 clican 2008-07-25  
酒店一天的数据怎么会有几百万?
13 楼 yjb1981 2008-07-25  
上百万级别的数据,用存储过程肯定比用jdbc实现速度要来的快,那怕是select语句,楼主遇到这种情况,只能说明存储过程写的有问题.
12 楼 athene11 2008-07-25  
都是操作表而已,java和存储过程区别并不大。
从LZ的描述看,应该是存储过程中select语句或者其它语句的关联有性能问题。
把几百万的表进行关联,确实是没有单独的几条select sql快的。
还有LZ说的原存储过程有逻辑不够好导致性能问题。
不过我相信你现在的方式用存储过程一样可以实现。并不是存储过程的问题。
11 楼 ladofwind 2008-07-25  
拿出些优化的事实步骤吧
10 楼 myy 2008-07-25  
我看这只能说明一个问题: 你们原来写的存储过程太太太差了
9 楼 armorking 2008-07-25  
hyhongyong 写道
把存储过程用java重写,并不是简单的重写。原来存储过程的步骤,如果用java直接按那个思路写,效率可能会相当差。只是用面向对象的方式重新实现一些存储过程的逻辑而已,至于性能的优化,在优化前我们并没有太大的把握,只是觉得性能出现问题了,DB上暂时又没有什么好办法可以提升(实际上我们也试了一些方法,比如存储过程中调试,加索引等但都没有实质提升),用java实现应该是一条路。



8 楼 jjx 2008-07-25  
得确,只有在每行有复杂的非数据库类计算时,java代码才有可能会比存储过程高效

另外,你这个优化的前提必须是这个存储过程没有设计问题,否则,这个比较也没有用
7 楼 0701 2008-07-25  
hyhongyong 写道
LS的,说话文明点!
不是我不想好好说,是提交的时候把回车给吃掉了!

得了吧你,别装了!
那你说为什么计算所有酒店的一天价格时,使用存储过程要10多分钟,而优化后只要不足一分钟?为什么原来会有这样的瓶颈?为什么优化后瓶颈消除了?
6 楼 hyhongyong 2008-07-25  
LS的,说话文明点!
不是我不想好好说,是提交的时候把回车给吃掉了!
5 楼 0701 2008-07-25  
乱78糟的,看着我头疼!
有话不能好好说啊,ok?
4 楼 hyhongyong 2008-07-25  
把存储过程用java重写,并不是简单的重写。
原来存储过程的步骤,如果用java直接按那个思路写,效率可能会相当差。
只是用面向对象的方式重新实现一些存储过程的逻辑而已,至于性能的优化,在优化前我们并没有太大的把握,只是觉得性能出现问题了,DB上暂时又没有什么好办法可以提升(实际上我们也试了一些方法,比如存储过程中调试,加索引等但都没有实质提升),用java实现应该是一条路。
3 楼 hyhongyong 2008-07-25  
关于存储过程,我们没有专门的DBA进行优化,我只能从自己理解的角度去思考一下: <br>
1、数据量:价格计算过程涉及到从4、5个表中取数据,其中有两个表的数据量较大(几百W)<br>
2、因为存储过程的技术限制,选择和归并是需要花些时间的。而程序可以优化这些过程<br>
3、DB表锁机制,存储过程占用表锁的时间相对长<br>
4、将时间长的存储过程时间,化了简单的DB表查询,压力转移到AP端(事实上压力对DB和AP优化前后都没有什么问题)<br>

2 楼 duooluu 2008-07-25  
没看出楼主采用了什么优化手段,只是把存储过程用Java重写了一遍效率就上来了?好像关键部分被掐了

相关推荐

    业务逻辑的存储过程封装方法

    通过封装业务逻辑到存储过程中,可以提高代码的复用性、安全性和性能。 #### 核心需求分析 根据题目描述,我们需要实现一个报表,用于展示不同销售金额区间的销售额以及它们占总销售额的比例。具体的业务需求包括:...

    .net 业务逻辑操作组件dll 仅支持存储过程

    .net 业务逻辑操作组件dll 仅支持存储过程.net 业务逻辑操作组件dll 仅支持存储过程.net 业务逻辑操作组件dll 仅支持存储过程.net 业务逻辑操作组件dll 仅支持存储过程.net 业务逻辑操作组件dll 仅支持存储过程.net ...

    什么是业务逻辑

    在软件开发过程中,业务逻辑通常位于用户界面和数据存储之间,起着桥梁的作用。 ### 业务逻辑的重要性 在软件开发中,业务逻辑至关重要,因为它直接关系到应用程序能否满足业务需求。一个良好的业务逻辑设计不仅能...

    细说业务逻辑

    在软件开发的过程中,“业务逻辑”是一个核心概念,它直接关联着软件产品的功能实现与价值传递。然而,对于许多开发者来说,业务逻辑的概念常常显得模糊不清。本文旨在通过深入探讨,帮助读者理解和把握业务逻辑的...

    Java-Oracle存储过程知识

    存储过程支持事务处理机制,可以在同一个存储过程中同时对主从表进行数据维护和有效性验证,便于实现数据的一致性和完整性。 ### 存储过程的移植性和修改 使用存储过程封装业务逻辑会限制应用程序的可移植性。一旦...

    计算机使用存储过程实现进销存系统的业务逻辑PPT学习教案.pptx

    在进销存系统这样的业务逻辑中,存储过程扮演着至关重要的角色,它们能够高效、安全地处理大量的数据操作,提高系统的性能。 在进销存系统中,【工作任务】可能包括审核入库单、出库单等业务流程。存储过程可以帮助...

    .net 业务逻辑操作组件dll 仅支持存储过程 支持多数据操作

    .net 业务逻辑操作组件dll 仅支持存储过程 支持多数据操作.net 业务逻辑操作组件dll 仅支持存储过程 支持多数据操作.net 业务逻辑操作组件dll 仅支持存储过程 支持多数据操作

    MySQL存储过程编程.pdf

    MySQL 存储过程编程是指在 MySQL 数据库中使用存储过程来实现业务逻辑的编程技术。存储过程是一种可以在数据库中存储和执行的程序单元,它可以实现复杂的业务逻辑和数据处理操作。 在 MySQL 5.0 中,存储过程的...

    什么是三层架构_表现层/业务逻辑层/数据访问层

    三层架构是一种常见的软件开发模式,旨在提高系统的可维护性、可扩展性和可重用性。...在实际开发过程中,可能还需要结合其他设计模式和最佳实践,如依赖注入、单元测试和持续集成,以确保代码的质量和可维护性。

    UAP报表中调用存储过程

    本文将详细介绍如何在UAP报表中调用存储过程,实现业务逻辑的自动化。 一、建立基础数据 在开始调用存储过程之前,需要建立基础数据,包括存货档案、BOM和仓库等。存货档案是指存货的基本信息,包括存货名称、规格...

    细说业务逻辑1

    4. 存储过程:在业务逻辑层调用存储过程是常见的做法,但也有人主张将逻辑移到应用程序代码中以提高可维护性。 业务逻辑的架构模式主要有以下几种: 1. Transaction Script:将每个业务操作视为独立的事务脚本,...

    数据库的存储过程

    总结,存储过程是数据库管理中的重要工具,它通过封装复杂的SQL操作和业务逻辑,提高了代码的可维护性和性能。理解并熟练运用存储过程,对于数据库设计和开发人员来说至关重要。通过不断实践和学习,我们可以更好地...

    oracle存储过程学习经典入门

    Oracle 存储过程是 Oracle 数据库中的一种程序单元,能够完成复杂的业务逻辑和数据操作。Oracle 存储过程的基础知识包括了解 Oracle 存储过程的基本语法、数据类型、变量声明、控制语句、循环语句、异常处理等方面的...

    银行转帐存储过程

    在这个场景中,我们关注的是一个名为"银行转账存储过程"的特定应用,它是针对银行转账业务逻辑的实现。这个存储过程主要用于模拟银行账户之间的转账操作,并包含了登录验证、转账处理以及事务管理等关键功能。 首先...

    SQL Server中存储过程比直接运行SQL语句慢的原因

    其次,复杂业务逻辑的封装。存储过程允许开发者封装多条SQL语句和事务管理,这对于处理复杂的数据库操作是很有帮助的。但当这些操作过于庞大或设计不佳时,可能导致执行效率下降。例如,一个存储过程内部的嵌套查询...

    oracle存储过程常用技巧

    Oracle存储过程是一种强大的数据库对象,它可以帮助开发者简化复杂的业务逻辑,并提高数据库的安全性和性能。在 Oracle 中,存储过程是一种特殊的 PL/SQL 程序,它可以接受输入参数,执行某些操作,并返回结果。在...

    DB2 SQL存储过程基础

    DB2 存储过程是指在 DB2 服务器端编写、执行的程序单元,可以实现业务逻辑、数据处理和事务控制等功能。存储过程是一种特殊的数据库对象,能够接受输入参数、执行复杂的业务逻辑、返回结果集等。 存储过程的基本...

    PLSQL中存储过程的建立,导出,导入,使用

    - **错误处理**:在编写存储过程中,应考虑异常处理逻辑,以便更好地处理可能出现的错误。 - **性能优化**:合理设计存储过程的结构和逻辑,避免不必要的数据加载和处理,以提高执行效率。 #### 七、总结 通过本文...

Global site tag (gtag.js) - Google Analytics