挑战:EJB事务超时后,如何中断SQL执行?

xiongdigujunfeng 2012-05-23 04:49:58
有个查询SQL,运行时间非常久10分钟,EJB事务超时设置为300s,调用SQL的方法在10钟后会返回结果,但EJB却提示事务已经超时,这种情况下EJB的事务超时还有什么用呢?

我想要达到的目的是:如果SQL运行时间超过timeout时间,就自动中止SQL执行,方法直接返回


提高SQL查询效率之类的办法就不要说了,治标不治本
...全文
213 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
loveofmylife 2012-05-24
  • 打赏
  • 举报
回复
其实我还想说的是,提高查询效率才是治本的方式,造成查询时间长的原因有很多,你应该想着去解决这个问题而不是去放弃这个问题,你kill掉这个sql的同时也有可能会造成数据的回滚等,如果不幸的话,同样会占用数据库大量的资源而导致你应用的阻塞
loveofmylife 2012-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

我是想能够由应用程序自动检测如果查询超时就自动kill掉自己的session,否则容易造成数据库压力
[/Quote]
可以啊
举个例子,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的进程或者线程就可以了
xiongdigujunfeng 2012-05-24
  • 打赏
  • 举报
回复
我是想能够由应用程序自动检测如果查询超时就自动kill掉自己的session,否则容易造成数据库压力
loveofmylife 2012-05-24
  • 打赏
  • 举报
回复
@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)

如果非得要终止,那么只能在os里kill掉这个sql的session了
xiongdigujunfeng 2012-05-24
  • 打赏
  • 举报
回复
不明白1楼的意思,请说的详细些
xiongdigujunfeng 2012-05-24
  • 打赏
  • 举报
回复
我也认同提高查询效率是治本方式,但对于查询时间超EJB的timeout的情况,界面实际上是取不到数据的,这种情况下SQL的执行结果已经无人接收,所以我觉得合理的方式应该马上返回异常,然后异步停止执行,这样就比较好了,不过看来EJB没有这种处理方式。
beowulf2005 2012-05-23
  • 打赏
  • 举报
回复
另起一个线程

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧