当前位置: 首页 > 知识库问答 >
问题:

为什么从DB游标提取总是返回与MyBatis和Spring事务相同的结果集

暨弘毅
2023-03-14

我的设置是Postgres数据库,该数据库通过JDBC驱动程序连接到Tomcat服务器(负责连接池),而Tomcat服务器又通过JNDI将该数据源服务到Spring应用程序。

在java应用程序中,我使用MyBatis和MyBatis-Spring查询数据库。现在,我想使用光标浏览一个表,如这个简单的示例http://www.costgresql.org/docs/9.3/statig/sql-fetch.html所示。

由于游标需要在DB事务中运行,我使用Spring DataSourceTransactionManager提供的@transactional注释对相关方法进行了注释(请参见http://mybatis.github.io/Spring/transactions.html)

疯狂的部分就从这里开始。在运行时,MyBatis映射器查询的每个fetch forward1000from cursor都返回一个相同的结果集。所以似乎每次调用时光标位置都会回滚。因此它会随时返回表的前1000行。

为什么下面的提取不返回下一个记录块?

共有1个答案

韦飞尘
2023-03-14

我发现MyBatis使用的缓存机制在我看来并不是很智能https://MyBatis.github.io/mybatis-3/configuration.html。

事实上,MyBatis默认缓存会话期间执行的所有查询。会话意味着事务或每个连接。所以在自动提交时,这是没有问题的。但不适用于在事务中fetch语句不更改的游标。

因此,一旦从游标中提取了DB中的第一个数据,结果就会缓存在内存中,并且不会向DB查询后续的提取。

<setting name="localCacheScope" value="STATEMENT"/>

对我来说,这似乎是一个bug,因为默认缓存作用域对DB游标没有意义。

 类似资料:
  • 问题内容: 我在某处读到,函数应始终仅返回一种类型,因此以下代码被视为错误代码: 我想更好的解决方案是 返回None然后创建一个新的空元组不是更便宜的内存明智的选择吗?或者即使在较大的项目中,这种时差也太小而无法引起注意? 问题答案: 为什么函数应该返回一致类型的值?满足以下两个规则。 规则1-函数具有“类型”-输入映射到输出。它必须返回一致的结果类型,否则它不是函数。一团糟。 从数学上讲,我们说

  • 问题内容: 为什么更改总和顺序会返回不同的结果? = = 双方的Java和JavaScript的返回相同的结果。 我知道,由于以二进制表示浮点数的方式,某些有理数( 例如1/3-0.333333 … )无法精确表示。 为什么简单地更改元素的顺序会影响结果? 问题答案: 也许这个问题很愚蠢,但是为什么仅仅改变元素的顺序会影响结果呢? 它将根据值的大小更改四舍五入的点。作为示例 _样的_事情,我们所看

  • 当我执行普通Select时,返回正确的结果,但当我执行Select for DB uptime时,它始终返回相同的第一个结果。我确实检查了Postgres日志,我看到select被执行了。

  • 本文向大家介绍Math.min() < Math.max() 返回结果是什么?为什么?相关面试题,主要包含被问及Math.min() < Math.max() 返回结果是什么?为什么?时的应答技巧和注意事项,需要的朋友参考一下 返回,因为返回,返回。 猜测的实现方式大致如下: 接受不定项参数,当参数只有一个的时候,例如,那么这个需要和(js中最小的数)进行比较,所以结果返回,哪怕传入的值再小,单个

  • 当前的问题是,以下SQL查询在通过phpMyAdmin SQL页面运行时查找并返回结果,但在使用PDO通过PHP脚本运行时不返回任何结果。(如未找到匹配结果) 有问题的查询: 我怀疑这与排序规则或正在使用的字符集有关,因为不使用任何特殊字符会得到预期的结果。 数据库使用的是latin1_swedish_ci排序规则。我尝试将pdo::mysql_attr_init_command设置为“设置名称'

  • 问题内容: 为什么这些逻辑运算符返回一个对象而不是布尔值? 我想了解为什么它返回(如果已定义)OR的结果,而不返回布尔结果。 问题答案: 将返回布尔值。 更新 请注意,这是基于我的测试。我不会被完全依赖。 它是一个 不 赋值或 不 赋值的表达式。而是分配计算的值。 让我们看一下这个表达式。 表达式示例: 您的表情: 另一个表达: 另一个表达: