2013-02-19 126 views
3

在SQL Developer中,点击取消任务按钮可以立即停止执行查询。我必须在我们的项目中实现相同的功能。SQL Developer中的“取消查询”是如何工作的

cancel query iamge

我使用BC4J作为一个ORM工具来执行查询。我必须取消一个名为thorugh视图对象的搜索查询执行,它会调用几个数据库函数/过程来获得结果。

我试过使用viewObject.cancelQuery();但它没有任何影响;查询一直执行到最后。

我通过JDBC连接池进行连接,由BC4J处理。

+0

你得到的错误信息是什么? – Incognito 2013-02-19 12:19:14

+0

我认为它直接像KILL一样在MySQL中执行。 – 2013-02-19 12:19:18

+1

@ bmorris591不是杀人。是取消查询。会议不会死亡。 – 2013-02-19 12:24:10

回答

2

我的建议是

  • 当查询提交
    • 块中的任何UI命令接受“取消”(最简单的方法:用一个模式对话框用于此目的,更方便用户:块只有本地视图命令)
    • 开始从UI线程不同的一个单独的线程查询,使用Runnable实现其
      • 都有自己的cancel()方法,
        • 来电cancelQuery resp。您的查询的cancel
        • 使用<query thread>.interrupt()将此事件标记为您的查询可运行;为此,您需要在<query thread>中存储对查询线程的引用。有效的IO操作有时会被这个信号中断!
      • 能够在run()InterruptedExceptionSQLException应对措施:如果这些异常逮住回滚事务(如果一个人开始在所有的只读查询)
      • 如果有多个长时间运行的语句在此可运行然后每个语句后检查Thread.currentThread().isInterrupted()cancel()如果结果为真
  • 上完成查询与您的用户界面同步,其结果
  • 上取消:查询可运行的
  • 忘记线程
    • 呼叫cancel()(但千万不要耗尽系统资源或连接池如果有太多的取消线程仍然还没有完)
    • 疏通你的UI

有辅助类的摇摆以及在Eclipse RCP的支持这种设计。