如何在内存db中设置fetchsize?

ia2d9nvy  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(481)

最近我正在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部分吗?

ttisahbt

ttisahbt1#

否定的 fetchSize jdbc不支持。以下是对 setFetchSize 抛出:
sqlexception—如果发生数据库访问错误,则对关闭的语句调用此方法,或者不满足条件rows>=0。
错误的原因是获取大小不正确( outOfRangeArgument 堆栈内跟踪也表明了这一点)。
mysql驱动程序不支持 Integer.MIN_INT 作为fetch size以指定结果集处于流模式:
前向只读结果集与integer.min\u值的fetch size的组合用作驱动程序逐行流式处理结果集的信号。在此之后,将逐行检索使用该语句创建的任何结果集。
mybatis本身不允许paramtrize fetchSize 在Map器配置中。
您需要使用一些技术通过 AspectJ 或者 PowerMock . 与 PowerMock 你可以用 PowerMock.stub 在调用执行查询的方法之前执行以下操作:

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

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

相关问题