job每5秒执行一次。每隔几天job就卡住一次,执行了几个小时也没执行完。
查看相关会话,发现正在执行一个select语句,这个语句是利用dblink访问远程数据库的一个表。
这是,如果在命令行中手动执行该job所调用的存储过程,能够执行通过。说明没有锁。
但是这个job始终被卡在select语句上,除非kill会话。
到底是什么引起的,有没有什么解决办法(手动kill会话的主意就不用再提了)

解决方案 »

  1.   

    不清楚...oracle我刚学的,不过我在ms sql里遇到一个过程手动执行的时候,可能1分钟就好了,如果放在别的过程里执行,有时候很快,有时候就要半小时,或者更久.后来在过程里重新定义一个变量来接收传进来的参数,用这个内部的变量,就再也没有出现过卡很久的情况
      

  2.   

    先确保你的sql语句执行没问题,这里指的是效率问题。然后看一下你的job的实现机制,调用过程的先后顺序。确保不冲突
      

  3.   

    这个可以能与你的存储过程执行的语句的效率有关,首先检查存储过程执行是否有问题,
    执行存储过程时是否有资源被锁锁住,最好把存储过程trace一下或者看一下日志文件
    找到其中的原因。
      

  4.   


    我说的很清楚了,没有锁。job被卡住的同时,手动执行job的存储过程,能很快的执行完
      

  5.   

    你有ping过dblink的那台服务器吗?是否存在丢包的现象?
    我是Java程序员不是专业的DBA,所以只是猜测下是否有这方面的原因
      

  6.   

    你的JOB 5秒执行一次,频率是不是太高了。
    你的JOB主要是执行什么工作,查询远端数据库的数据,用返回的数据插入本地表?
      

  7.   

    你查看alert日志是否有JOB进程出错的信息。如果是进程出错成了死进程应该在alert日志里有记录还有trace文件生成的。
      

  8.   


    是的。并且总是被卡在select语句上
      

  9.   

    alter中没有该job的错误,因为系统认为该job 还在执行呢。
      

  10.   

    跟踪pl/sql执行语句不就知道了。
      

  11.   

    你应该在出现这个问题的时候,对那个job做个sql_trace来查看这个job真正在做什么
    还有,你的select 返回的数据量是否固定,你插入表是否有约束,触发器.
    你的存储过程里有没有考虑先将返回的数据存储在临时表里,然后用临时表来执行插入操作
      

  12.   

    select 从dblink远程表中读数据,然后插入到本地表。select返回的数据量不固定,插入表没有约束(有主键,和非空),没有触发器
      

  13.   

    看一下你的 OPEN_LINKS 和 OPEN_LINKS_PER_INSTANCE 参数