人为的无限循环即停止方法
2013-09-04 17:07
204 查看
有一些程序,比如系统监控工具,就应该是永远执行。这种情况下,就会需要人为的无限循环:
loop
data_gathering_procedure;
end loop;
由于持续的运行对cpu资源消耗严重,为了避免资源耗费殆尽,病保证数据收集过程尽可能有效的运行,
所以需要循环在运行中适当的暂停。
loop
data_gathering_procedure;
dbms_lock.sleep(10) ; //10秒内不作任何事情
end loop;
当然 ,那么我们又如何结束这种无限的循环呢?通常我们都是以存储过程形式运行,即便杀掉前台进程也不会终止后台进程。我们可以使用alter system kill session,但在某些版本的oracle中这个命令并不会杀掉一个卡在循环中的会话。
所以我们必须求助于操作系统的工具了,比如unix/linux平台的kill以及windows的orakill.exe.这些工具需要知道oracle的系统进程的ID,在V$SSEION和V$PROCESS中很容易查出。
当然我们还有更好的方法解决这个问题,在循环中插入一个“命令解释器”,然后通过数据库内置的进程间通讯机制来发送命令即数据库通道。
declare
pipename constant varchar2(12):='signaler';
result integer;
pipebuf
varchar2(64);
begin
/* 创建一个指定名字的私有管道*/
result:=dbms_pipe.create_pipe(pipename);
loop
data_gathering_procedure;
dbms_lock.sleep(10);
/*检查管道是否有信息*/
if dbms_pipe.receive_message(pipename ,0)=0
then
dbms_pipe.unpack_message(pipebuf);
exit when pipebuf='stop';
end if;
end loop;
end;
现在可以构造一个简单地伙伴程序,这个程序只需要通过在管道中发送一个‘stop‘就可以终止这个循环的运行。
declare
pipename varchar2(12):='signaler';
result integer :=dbms_pipe.create_pipe(pipename);
begin
dbms_pipe.pack_message('stop');
end;
loop
data_gathering_procedure;
end loop;
由于持续的运行对cpu资源消耗严重,为了避免资源耗费殆尽,病保证数据收集过程尽可能有效的运行,
所以需要循环在运行中适当的暂停。
loop
data_gathering_procedure;
dbms_lock.sleep(10) ; //10秒内不作任何事情
end loop;
当然 ,那么我们又如何结束这种无限的循环呢?通常我们都是以存储过程形式运行,即便杀掉前台进程也不会终止后台进程。我们可以使用alter system kill session,但在某些版本的oracle中这个命令并不会杀掉一个卡在循环中的会话。
所以我们必须求助于操作系统的工具了,比如unix/linux平台的kill以及windows的orakill.exe.这些工具需要知道oracle的系统进程的ID,在V$SSEION和V$PROCESS中很容易查出。
当然我们还有更好的方法解决这个问题,在循环中插入一个“命令解释器”,然后通过数据库内置的进程间通讯机制来发送命令即数据库通道。
declare
pipename constant varchar2(12):='signaler';
result integer;
pipebuf
varchar2(64);
begin
/* 创建一个指定名字的私有管道*/
result:=dbms_pipe.create_pipe(pipename);
loop
data_gathering_procedure;
dbms_lock.sleep(10);
/*检查管道是否有信息*/
if dbms_pipe.receive_message(pipename ,0)=0
then
dbms_pipe.unpack_message(pipebuf);
exit when pipebuf='stop';
end if;
end loop;
end;
现在可以构造一个简单地伙伴程序,这个程序只需要通过在管道中发送一个‘stop‘就可以终止这个循环的运行。
declare
pipename varchar2(12):='signaler';
result integer :=dbms_pipe.create_pipe(pipename);
begin
dbms_pipe.pack_message('stop');
end;
相关文章推荐
- viewpager的无限循环方法
- php用压栈的方式,循环遍历无限级别的数组(非递归方法)
- ViewPager实现无限循环的2种方法
- 玩死浏览器的n种方法 (1)----动态dom集合导致的无限循环
- nextInt()方法在无限循环中,无法停止的问题
- iOS开发中实现新闻图片的无限循环展示的方法
- EasyUI Tree树组件无限循环的解决方法
- ubuntu 登录界面无限循环问题解决方法
- Android使用ViewPager做无限轮播,人为滑动时停止
- 关于ListView中多个EditText之间相互联动导致无限循环问题的解决方法
- 用最简单的方法实现ViewPager无限循环滑动(跑马灯)效果
- ViewPager系列之ViewPager无限循环滑动原理、代码、2种实现方法比较
- JetBrains idea无限循环indexing解决方法
- 利用DataView.ToTable 方法 (String) 在结果中查询,可以实现无限次循环
- Java通过在主循环中判断Boolean来停止线程的方法示例
- 使用Handler中postDelayed方法实现广告页面无限循环轮播效果
- Hibernate实体list、set生成Json出现类属性无限循环解决方法
- Shell脚本之无限循环的两种方法
- Ubuntu 14.04解决登录界面无限循环的方法
- Android Studio导入第三方包(资源)方法,ViewPager+TabLayout的使用,ViewPager单独使用实现无限循环