gpt4 book ai didi

ibatis - 如何取消一个 iBatis prepared statement?

转载 作者:行者123 更新时间:2023-12-05 01:14:16 26 4
gpt4 key购买 nike

我需要一个解决方案来取消长时间运行的选择语句。我正在使用 Spring 3.0.2、iBatis 2.3.0 和 Oracle 10g。我设法让它与普通 JDBC 一起工作,但是因为选择是通过高级搜索屏幕动态生成的,所以我真的需要使用 iBatis。

负责创建/从缓存中检索准备好的语句的 iBatis 内部类是 com.ibatis.sqlmap.engine.execution.SqlExecutor。每次调用queryForList()/queryForObject()调用的内部方法都是SqlExecutor的

public void executeQuery(RequestScope request, Connection conn, String sql, Object[] parameters, int skipResults, int maxResults, RowHandlerCallback callback) 抛出 SQLException方法。

由于性能原因,iBatis 只有在给定的 select 语句不存在的情况下才会创建一个新的准备好的语句。准备好的语句存储/缓存在 HashMap 中,其中 sql 字符串是键,准备好的语句是值。

在尝试了不同的其他解决方案但没有成功之后,我认为可以使用 AOP (AspectJ) 尝试切入 SqlExecutor.executeQuery() 方法并以某种方式存储在 HTTP session 中iBatis 缓存映射和 sql 字符串。

当用户试图取消长时间运行的查询时,将从另一个线程进行检查,以查看 iBatis 缓存映射中是否已经存在针对给定 sql 字符串的准备好的语句,该语句先前存储在 HTTP session 中AOP。如果确实存在,将发出 Statement.cancel() 调用。我不明白为什么像这样的解决方案可能会干扰 iBatis 内部机制,因为如果准备好的语句将被取消,将抛出 SqlException(ORA-01013 用户请求取消当前操作)并且Ibatis 将像处理任何其他生成的 SqlException 一样正确处理它。

使用 Spring AOP 不是一种选择,因为它只允许您切入在 Spring 容器管理的对象中声明的方法。我不能将 SqlExecutor 声明为 Spring bean,因为它是由 iBatis 在内部创建和管理的。

由于我对 AspectJ 框架不太熟悉,所以还没有尝试过使用 AspectJ 的上述解决方案。

我不确定这是否是正确的方法,但我没有找到另一种解决方案来取消由 iBatis 创建的准备好的语句,因为 iBatis 似乎没有为此提供任何支持(也检查过myBatis)。

最佳答案

您是否尝试过获取对运行该语句的连接的引用,并使该连接无效?

关于ibatis - 如何取消一个 iBatis prepared statement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5180199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com