gpt4 book ai didi

mysql - 如何在内存数据库中设置 fetchSize?

转载 作者:行者123 更新时间:2023-11-29 07:27:31 24 4
gpt4 key购买 nike

最近我在Junit上工作,用hsqldb(2.3.3)测试Dao相关的代码。系统使用mybatis做数据持久化。

在 mybatisXXsql.xml 中,select 语句中有“fetchSize”属性,例如:

<select ... resultSetType="FORWARD_ONLY" fetchSize="-2147483648">
...
</select>

当我们用hsqldb调用测试sql时,出现如下异常:

Caused by: java.sql.SQLException: Invalid argument in JDBC call
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
at org.hsqldb.jdbc.JDBCUtil.outOfRangeArgument(Unknown Source)
at org.hsqldb.jdbc.JDBCPreparedStatement.setFetchSize(Unknown Source)

我检查过它似乎不支持内存数据库中的“fetchSize”,谁能给我一些建议,我该如何测试这个 sql 部分?

最佳答案

fetchSizenot supported通过 JDBC。以下是 setFetchSize 抛出的异常的描述:

SQLException - if a database access error occurs, this method is called on a closed Statement or the condition rows >= 0 is not satisfied.

错误的原因是获取大小不正确(堆栈跟踪中的outOfRangeArgument 也表明了这一点)。

mysql 驱动程序确实支持 Integer.MIN_INT 作为获取大小以指定结果集处于流模式:

The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE serves as a signal to the driver to stream result sets row-by-row. After this, any result sets created with the statement will be retrieved row-by-row.

mybatis 本身不允许在 mapper 配置中参数化 fetchSize

您需要使用一些技术来通过 AspectJPowerMock 覆盖配置。使用 PowerMock,您可以在调用执行查询的方法之前使用 PowerMock.stub 执行类似的操作:

PowerMock.stub(
PowerMock.method(
org.apache.ibatis.mapping.MappedStatement.class,
"getFetchSize"
)
).toReturn(1);

这样,当 mybatis 将创建一个 Statement 时,它将为 fetchSize 使用模拟值

关于mysql - 如何在内存数据库中设置 fetchSize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53114053/

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