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

时间:2018-11-02 07:09:01

标签: mysql junit mybatis hsqldb

最近,我正在研究Junit,以使用hsqldb(2.3.3)测试与Dao相关的代码。系统正在使用mybatis进行数据持久化。

在mybatisXXsql.xml中,选择语句中有“ 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部分吗?

1 个答案:

答案 0 :(得分:1)

负数fetchSize是JDBC的not supported。以下是setFetchSize引发的异常的描述:

  

SQLException-如果发生数据库访问错误,则在关闭的Statement上调用此方法,或者不满足条件行> = 0。

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

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

  

仅转发,只读结果集与访存大小为Integer.MIN_VALUE的组合,向驱动程序发出信号以逐行传输结果集。之后,使用该语句创建的任何结果集都将逐行检索。

mybatis本身不允许在映射器配置中对fetchSize进行参数化。

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

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

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