是否可以使用 iBATIS 中止长时间运行的查询?

Posted

技术标签:

【中文标题】是否可以使用 iBATIS 中止长时间运行的查询?【英文标题】:Is it possible to abort a long running query using iBATIS? 【发布时间】:2013-02-04 07:03:06 【问题描述】:

我有一个 GUI,它允许用户运行长时间运行的查询。有时,用户会后悔运行查询并想取消它们。查询使用 iBATIS 针对 Oracle 数据库运行,我知道 java.sql.Statement 接口定义了一个取消方法,该方法可能由驱动程序实现,也可能不实现。所以我的问题是,是否可以使用 iBATIS 调用此方法来取消查询(给定正确的驱动程序),或者是否有任何其他方式中止正在进行的长时间运行的查询。

【问题讨论】:

【参考方案1】:

嗯, 我想一旦到达数据库服务器,取消它确实是一个“特定于数据库供应商”的问题。 如果您的要求是取消查询,当涉及到您的应用程序时 (即 - 如果它到达 Oracle DB 服务器,并在那里运行,你很好,只要你不会得到结果),考虑使用具有取消方法的 Future 接口。 你可以submit一个“Callable”来运行你的查询,它会返回一个正确的类型对象,它是一个实现。 如果您需要中止 - 只需使用未来对象的“取消”方法。 您还可以使用“isCanceled”检查提交是否被取消,并对您的代码进行适当的处​​理。

【讨论】:

我相信 iBATIS 不支持这个,不是吗? 这是纯 java SE 代码。让您的 iBATIS 调用使用 Callables 包装并使用 ExecutorService 调用。我们以这种方式取消对 ldap 服务器的查询(即 - 它们可能在 ldap 服务器上被调用,我们以这种方式忽略结果) 听起来很有趣。您有任何可以查看的代码示例吗? 不使用 iBatis,但总的来说 - 我是 oVirt 开源项目引擎核心部分的维护者。访问我们的网站 - www.ovirt.org 并 git 克隆“引擎”部分。您可以在其中找到 ThreadPoolUtil.java - 例如,您将看到我们将它与 invokeAny 一起使用,并返回 Future,然后您将能够在我们的代码中找到一个带有 cancel() 方法的示例。

以上是关于是否可以使用 iBATIS 中止长时间运行的查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何中止 WinDbg 中的长时间操作?

如何找到长时间运行的查询?

中止正在运行长查询的线程

.NET:同步长时间运行任务的机制

使用查询调控器防止查询长时间运行

Redshift 终止长时间运行的查询