mashiguang

小马快跑

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  20 随笔 :: 0 文章 :: 60 评论 :: 0 Trackbacks
 

最近公司客户反映有些页面运行速度太慢,通过对系统代码的分析,发现排行榜功能是罪魁祸首,因为数据量太大,每次刷新页面都计算一次排行榜,的确耗时费力。

其实可以让数据库自己计算排行榜,并把计算结果保存到一个单独的表里去,这个表只用来保存排行榜的数据,数据量很小,然后所有的排行榜查询都去select这个表。

计算排行榜的功能我们可以写成一个存储过程,但是排行榜的数据不是一成不变的,还需要不时的调用这个存储过程才行,oracle为我们提供了dbms_jobs

oracel dbms_jobs包可以提交作业到作业队列中,这个包中还提供其它一些函数管理以前提交的作业,如对作业进行修改、禁止或删除等操作。

常用函数:

submit(),提交作业到作业队列。

isumbit()

remove(),从作业队列中删除作业。

change(),改变已有作业的参数。

what(),改变作业要执行的代码。

next_date(),改变作业下一次执行时间。

interval(),改变作业执行的时间间隔。

broken(),暂停执行作业。

run(),强制执行作业。

最常用的submit()函数:

dbms_jobs.submit(

       job out binary_integer,

       what in varchar2,

       next_date in date default sysdate,

       interval in varchar default null,

       no_parse in boolean default false,

       instance in binary_integer default any_instance,

       force in boolean default false

);

submit函数参数:

job,作业的作业号,是个输出参数,所以调用submit函数时,这个参数要指定一个已存在的变量。

what,作业要执行的代码,一般是存储过程。

next_date,下一次作业运行的日期。

interval作业执行的间隔时间,这个参数默认值是null也就是what指定的代码只在next_date这一时间执行一次。

no_parse,默认值是false,当参数值是false,提交作业时就对what指定的代码进行语法分析;当参数值是true,第一次运行what指定代码时才进行语法分析。

instance,指明运行作业的数据库实例。

force,如果是true,instance可以是任何正数;如果是falseinstance指定的实例必须正在运行。

示例:

var jobno number;

begin

dbms_job.submit(:jobno,'p_xxx_taxis;',trunc(sysdate)+(18/24),'trunc(sysdate+1,''hh'')');--每天18点执行

commit;

end;

上面这段话要在 命令窗口 下运行,如在pl/sql developer里面的-->新键-->命令窗口

这样就会在每天的18点执行存储过程p_xxx_taxis。在我这里p_xxx_taxis执行的是计算排行榜的任务。

posted on 2008-07-14 16:56 mashiguang 阅读(4121) 评论(6)  编辑  收藏

评论

# re: oracel dbms_jobs的使用 2008-07-14 18:19 bt
java的效率本来就不好,数据量大一点就不行了。呵呵。  回复  更多评论
  

# re: oracel dbms_jobs的使用 2008-07-15 13:30 lan
排行榜之类的东西,本身就不应当是实时的,本身就不是页面去做的。
应当每隔一段时间在后台作一次,叶面仅仅是取结果。
如果做成实时的,系统肯定会受不了,当然专业网站除外。  回复  更多评论
  

# re: oracel dbms_jobs的使用 2008-07-15 14:50 mashiguang
谢谢楼上的回复.
写这篇文章目的主要是记录oracel dbms_jobs的使用方法,不是记录排行榜这类东西用什么方案实现.  回复  更多评论
  

# re: oracel dbms_jobs的使用[未登录] 2008-07-26 13:59 paul
不知lz是怎么更新的,是先将原table数据删除,在将排好的数据insert,如果这样的话,到了定时更新时间后台正在更新。会不会造成前台无数据显示啊  回复  更多评论
  

# re: oracel dbms_jobs的使用 2008-07-28 10:14 mashiguang
楼上说的是,的确会出现无数据显示的情况,我选择每天18点运行,是因为这个页面主要是美国的客户访问,估计他们不会大清早的访问这个页...
但这种情况也不是肯定不会发生,有更好的办法吗?
  回复  更多评论
  

# re: oracel dbms_jobs的使用 2008-07-28 10:21 mashiguang
先insert,再delete,查的时候倒序只要最后10条.  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: