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

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

【问题讨论】:

    标签: java sql 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() 方法的示例。
    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2017-02-26
    • 1970-01-01
    • 2011-06-15
    相关资源
    最近更新 更多