大家写存储过程吗?项目中。

把妹达人老张 发布于 2013/06/24 14:21
阅读 3K+
收藏 6
我没写过。因为我不会写,或者我更想将逻辑部分用java代码控制。大家呢?什么情况下又必须要用存储过程或者触发器之类的?
加载中
1
乌龟壳
乌龟壳

存储过程一般用在大量数据操作中,而且很多系统核心的业务逻辑也就是那些数据的操作。

但在存储过程里写类似if a == 0 then return "是“ else return "否" end之类的表现层的功能,就有点不靠普了,具体的还是要具体情况去分析。

大部分内容发布类的系统(这些系统很多都比较强调适应性,可能会部署在不同数据库上),尽量少用存储过程。但一些数据分析型业务中数据集大但是运算规则简单的,还有一些一次性数据操作项目比较多的业务,用存储过程或者触发器等会比较合适。

SQL以及很多数据库对sql的扩充,使其动态性是很好的,这比java要灵活很多,设计模式啊,反射啊等等一大堆所谓的高级特性,在数据库中还是很好实现的,反正就我个人觉得比java实现起来容易很多。

如果觉得在java里面会做得比存储过程还灵活,很可能只是把存储过程当成存放一大堆sql的标签了,而没有去好好规划函数的功能,使其能很好地重用,导致大量重复代码,或者一点都不灵活的代码。

比如一些数据表都有一定的共性运算,这些表的类型也可能会随着用户的需要不断增加,但是对它基本的运算还是那些。这样的情况就可以用固定的存储过程来处理。例如数据库可以知道自己有哪些表(反射),可以通过sql筛选出需要的表,可以通过拼接出的sql自动生成针对那些表的运算(工厂),同时可以把这些运算结果汇总成一个结果集(接口)。这些都只需要固定的存储过程代码就可以了,不会说表一增加就要增加存储过程,或者修改以前的存储过程什么的。

另一方面是性能,如果用java生成大量的sql,代替存储过程,这个倒是没有什么本质区别,只不过可能交互sql的开销会比较大。但如果是抛弃复杂sql,sql只做简单查询,复杂逻辑都放到java里,那可能要考虑几个问题:

java代码可以针对这个处理并行执行吗?这样能充分利用处理器资源。

java代码对于极大的数据量是否要编写外部排序,外部查找,外部缓存等不能把所有运算对象都放入内存的情况下的处理代码?

java针对这个业务的处理算法足够高效吗?比如什么时候对表上锁,什么时候解锁,上多少粒度的锁?还有是否做了足够并且恰当的缓存,避免重复运算?

这些问题是数据库都作了很多优化的,如果这类型的处理很多,而java代码又不能很好解决以上问题,建议还是用sql去对大数据集去处理,而不要加载到java中。

不过很多适合上类似hadoop等分析系统的数据,没有以上问题的,那些只需要分析,而且对准确性要求不是特别高的数据,甚至放在文件中临时存起来都可以。

max佩恩
max佩恩
说得比较有道理。不过性能的扩展应该怎么处理?数据库可不象应用服务器那样可以比较容易的横向扩展。如果数据库运算压力过大,则最后还是要想办法把这些运算分离出来的
0
南湖船老大
南湖船老大
做电信业务用过,而且用过很多
0
redraiment
redraiment
写,而且很多。把所有存/取数据的操作交给SP,这样Java中不会出现字符串形式的SQL语句,只有最简单的SP调用语句。
0
李博源
李博源
我再做GE项目的时候写过,相当难受,主要还是我对数据库不擅长吧。
0
顺顺利利
顺顺利利
会不会加大数据库的压力啊?
0
Andy
Andy

受教科书影响太深,10年前用过。但后来几乎不用了。

实际的项目中和数据库系统耦合太深,会有很多的弊端。

0
中山野鬼
中山野鬼

引用来自“Andy”的答案

受教科书影响太深,10年前用过。但后来几乎不用了。

实际的项目中和数据库系统耦合太深,会有很多的弊端。

楼上这话是实话啊。该做什么做什么,别做不该做的事情。否则换个地方或情况,就悲催了。。哈。
0
把妹达人老张
把妹达人老张

引用来自“中山野鬼”的答案

引用来自“Andy”的答案

受教科书影响太深,10年前用过。但后来几乎不用了。

实际的项目中和数据库系统耦合太深,会有很多的弊端。

楼上这话是实话啊。该做什么做什么,别做不该做的事情。否则换个地方或情况,就悲催了。。哈。
但是面试的时候,还是再问。而且我刚工作1年。
Cavalier
Cavalier
其实用不用。看足球的。对于单一数据库而言。 没有多数据库需求,存储过程或着触发器的效率会很高的,比如以前的一个项目,用的只是oracle,存储过程满天飞。 但是对于多数据库语言环境来说,换个库就换一套sql语句,有点麻烦
0
恺哥
恺哥

存储过程还是比较常用的;

反而触发器的应用相对少了,因为触发器太隐蔽了,对维护产生影响;

存储过程的执行效率还是比较高的(相对于java),因为存储过程更接近核心,减少了java与db之间的往返次数(减少了网络及资源的开销);同时存储过程都是经过预编译的,而且在高速缓存区,所以执行效率还是能够保证的

0
吐槽的达达仔
吐槽的达达仔

触发器比较常用。。。存储过程一般做数据批处理的。。

返回顶部
顶部