如何使mysql 存储过程 并发可以被多用户并发执行

Oracle的存储过程编程 - 并发编程网- - ITeye技术网站
博客分类:
什么是存储过程?
是一个可以用编程的方式来操作SQL的集合。
存储过程的优点?
执行效率很高,因为存储过程是预编译的,即创建时编译,而SQL语句是执行一次,编译一次。调用存储过程可以大大减少同数据库的交互次数。
降低网络通信量,因为存储过程执行的时候,只需要call存储过程名,不需要传递大量的SQL语句。
有利于复用。
存储过程的缺点?
移植性非常差,如果在oracle上写的存储过程,移植到mysql需要修改。
代码可读性差,实现一个简单的逻辑,代码会非常长。
存储过程的用途?
造测试数据:可以使用存储过程,往表里造几百万条数据。
数据同步:两个表之间按照一定的业务逻辑进行数据同步。
数据挖掘。
存储过程注意事项?
数据量大的时候(10万+),一定要做压力测试,有些存储过程在大数据量的情况下才会出现问题。
如果插入或者更新的次数比较多,为了提高效率,可以执行一万次,再commit一次。
如果先插入记录,没有commit,再对这条记录进行更新,会引起死锁。如果先后对同一笔记录进行更新,又没有commit,也会引起死锁。因为后一条语句会等待前一条语句提交。如果出现这种情况,则需要一条条commit。
不要忘记在存储过程里写commit。
如何写存储过程?
--创建或者更新存储过程update_user_p
create or replace procedure update_user_p(param1 in varchar2) is
v_taskName VARCHAR2(20); --定义变量,Oracle类型。
number(12);
--将User_Advisor_Log表的结果集赋给cur
CURSOR cur IS
SELECT * FROM User_Advisor_L
--sql开始标记,以上是定义变量,以下才写程序
DBMS_OUTPUT.PUT_LINE(param1);
DBMS_OUTPUT.PUT_LINE('start!');
--遍历结果集
for cur_result in cur LOOP
v_taskName := cur_result.TASK_NAME; --将结果集赋给变量v_creator,一个语句结束需要分号结尾。
--if语句开始
if v_taskName & 0 then
NULL; --NULL 语句表明什么事都不做,这句不能删去,因为PL/SQL体中至少需要有一句;
--while循环
while v_taskName & 0 LOOP
--建议每循环一万次提交一下
v_i := v_i + 1;
if mod(v_i, 10000) = 0 then
--有异常输出,或者在这里回滚
when others then
DBMS_OUTPUT.PUT_LINE('update_user_p has error!');
end LOOP; --循环结束
DBMS_OUTPUT.PUT_LINE('end and commit!');
end update_user_p;
一个简单的造数据存储过程
--往表里造40万数据。
create or replace procedure vas_create_acookie_data_p is
v_i number(12);
while v_i & 400000 LOOP
insert into TableName (GMT_CREATED,
GMT_MODIFIED,
MEMBER_ID)
(sysdate, 'sys', sysdate, 'sys', v_i);
v_i := v_i + 1;
end vas_create_acookie_data_p;
如何执行存储过程?
执行存储过程:call update_user_p('this is param')。在output
里可以看见DBMS_OUTPUT.PUT_LINE的输出。
如何调试存储过程?
在plsql里编辑存储过程,点击执行,系统会告诉你,错误的行数和原因。并能显示代码结构。
另外可以使用DBMS_OUTPUT.PUT_LINE打印异常,注意打印异常时,输出上下文(如错误的taskName)。
用存储过程插入40万数据用了10秒。
遍历并判断40万条数据用了25秒。
80万次SQL判断+40万次SQL插入=25秒。
存储过程执行非常慢,有可能是更新语句引起了死锁,也有可能是语句执行慢(需要建索引)。
存储过程编译非常慢,有可能是当前存储过程正在执行,被锁住了。(使用DBA帐号解锁)。
浏览 17123
浏览: 396340 次
来自: 杭州
没数据库设计
而且这样要写代码
还是做成配数据库好
支持楼主,但这本书没有讲trident,有些过时了~到amaz ...
我在FunctionProvider中,获取的Property ...
leonevo 写道hi, 我也在设计cmdb. 我觉得基于传 ...关于存储过程的使用,如何适度的在使用存储过程?
Description of your first forum.
23 篇帖子 & 分页:2 / 2 &
由 ljsh2008 & 星期六, 日 18:48
用存储过程速度上比较快
由 j_shen2000 & 星期二, 日 20:09
其实从更深层的意义上讲,这是数据库分层设计的一种模型,VIEW代表表现层,PROC代表
业务逻辑层,而物理表代表物理存储层,特别对于大型项目来说,数据库分层设计是很有
价值的。如果有兴趣,大家可以看看与设计模式有关的一些书。
由 tony wong & 星期二, 日 22:30
两次同意army jiang .补充:在实际经验中,我发现存储过程还有一个用处,对于多用户环境,可以
将并行操作通过DBMS转为串行操作.不必考虑一些并发锁定问题.其中例子之一,如果几个用户
同时操作某表,欲自动产生某号码,则用存储过程可保证号码一定是连续不重复的.(当然,可以
使用DBMS的具有&IDENTITY&属性的字段,不过有时实在用起来不方便,比如,你只能Insert 之后
才可以用SELECT VAR1=@@IDENTITY之类的语句.)//SQL Server.
另外,如果缺乏经验,您可以先不用存储过程,整个程序调通之后,再改为stored procedure进行优化.
(好象不符合软件工程? NO,谁的程序是一气呵成的?)
对于工作量小的Server,喜不喜欢,优不优化成stored Procedure并不重要.反之,一定不能因为
&可移植性&而牺牲性能,速度.正如armyjiang 第二次所言,Use stored procedure&可移植性&
从总体而言反而是很好的.
由 子陵 & 星期四, 日 13:18
由 yanliang & 星期日, 日 16:52
我觉得存储过程的好处很多,
如果你是存储过程的编写和调试高手,能用存储过程的地方尽量用存储过程。
我以前不喜欢用存储过程,总是把业务处理放在代码中来实现,
但是这莫做的最大的坏处就是一旦当这个业务的处理流程发生变化你就必须去更新客户端程序!
这样的工作量比较大,因为你要重新分发客户端程序!
要是把业务逻辑用存储过程来实现则可以避免这个问题。
还有从“层”的角度来考虑,存储过程更像一个“中间层”,他封装业务逻辑,
客户端只需要传入必要的参数,其他的完全不需要考虑,然后得到返回的结果
即可。这样从编程上讲也有利于团队的合作。
由 b2sun & 星期一, 日 12:50
/delphibbs/DispQ.asp?LID=1354567
关注一下吧没有人提起来呀!用MODEM打电话利用PC机的耳机和麦克风,自己编程如何实现?
(我知道有现成的软件可以用,但是我想自己实现这个上东西)
请各位大侠多多指教!
由 tinyint & 星期一, 日 15:20
什么叫适度处理?
能有存储过程的地方尽量使用存储过程,这就是原则。
由 子陵 & 星期四, 日 13:09
23 篇帖子 & 分页:2 / 2 &MSSQL基础 &&&&最新内容
MSSQL基础 &&&&随机内容温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
作挨踢的....
主要是oracle erp
以前广东顺德,后出差京城
北京工作了。。。。。。
不能急躁,一步一步走实
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1062)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'使用Java存储过程实现并发请求',
blogAbstract:'
此练习参考 oracle developer guide
工具:使用JD10.1.3.3
此程序使用SQLJ来实现一个简单的输出.主要是学习Java在EBS中的实现的方式.
开发员指南中指出实现这个目标需要五步
使用SQLJ或JDBC编写java程序.你可以使用fnd_file包来写log和output
把java类加载到数据库
发布过程到数据字典中
在系统中,定义可执行.在执行方法中选择 \"Java 存储过程\"/\"Java Stored Procedure\",在执行文件名中输入&packagename&.&procedure name&
blogTag:'oracle,erp,java,sqlj',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:9,
publishTime:7,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'作挨踢的....\r\n主要是oracle erp\r\n以前广东顺德,后出差京城\r\n北京工作了。。。。。。\r\n不能急躁,一步一步走实',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 oracle 过程 并发执行 的文章

 

随机推荐