3

在 SQL Developer 中,单击“取消任务”按钮会立即停止执行查询。我必须在我们的项目中实现相同的功能。

取消查询

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

我尝试过使用viewObject.cancelQuery();,但没有任何效果;查询一直执行到最后。

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

4

1 回答 1

2

我的建议是

  • 提交查询时
    • 阻止任何 UI 命令接受“取消”(最简单的方法:为此使用模式对话框,更方便用户:仅阻止本地视图命令)
    • 在不同于 UI 线程的单独线程中启动查询,使用一个Runnable实现
      • 有自己的cancel()方法
        • 分别打电话cancelQuerycancel您的查询
        • <query thread>.interrupt()使用;将此事件发送给您的可运行查询 为此,您需要将对查询线程的引用存储在<query thread>. 活动的 IO 操作有时会被此信号中断!
      • 能够处理InterruptedException并且SQLExceptionrun():如果这些异常被捕获回滚事务(如果一个为只读查询启动)
      • 如果此可运行文件中有多个长时间运行的语句,则Thread.currentThread().isInterrupted()在每个语句之后检查,cancel()如果结果为真
  • 在完成查询时将其结果与您的 UI 同步
  • 取消时:
    • 调用cancel()您的查询可运行
    • 忘记线程(但如果有太多取消的线程仍未完成,请确保不要耗尽系统资源或连接池)
    • 解锁您的用户界面

Swing 和 Eclipse RCP 中都有支持这种设计的辅助类。

于 2013-03-01T12:12:47.517 回答