有个查询SQL,运行时间非常久10分钟,EJB事务超时设置为300s,调用SQL的方法在10钟后会返回结果,但EJB却提示事务已经超时,这种情况下EJB的事务超时还有什么用呢?我想要达到的目的是:如果SQL运行时间超过timeout时间,就自动中止SQL执行,方法直接返回
提高SQL查询效率之类的办法就不要说了,治标不治本

解决方案 »

  1.   

    @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)如果非得要终止,那么只能在os里kill掉这个sql的session了
      

  2.   

    我是想能够由应用程序自动检测如果查询超时就自动kill掉自己的session,否则容易造成数据库压力
      

  3.   

    可以啊
    举个例子,oracle 11g来说
    v$session中有两列,sql_id和prev_sql_id分别代表当前的sqlid以及上一个执行的sqlid
    对你当前的schema授权v_$session,v_$process,v_$sql
    然后通过v$sql找出sql_text like 你的当前sql的sqlid,通过sqlid去v$session中找到paddr,然后通过这个paddr去v$process中找到os的pid(字段为spid),然后在os中kill这个spid的进程或者线程就可以了
      

  4.   

    其实我还想说的是,提高查询效率才是治本的方式,造成查询时间长的原因有很多,你应该想着去解决这个问题而不是去放弃这个问题,你kill掉这个sql的同时也有可能会造成数据的回滚等,如果不幸的话,同样会占用数据库大量的资源而导致你应用的阻塞
      

  5.   

    我也认同提高查询效率是治本方式,但对于查询时间超EJB的timeout的情况,界面实际上是取不到数据的,这种情况下SQL的执行结果已经无人接收,所以我觉得合理的方式应该马上返回异常,然后异步停止执行,这样就比较好了,不过看来EJB没有这种处理方式。