Как мне установить fetchSize в памяти дБ? - PullRequest
0 голосов
/ 02 ноября 2018

Недавно я работаю над Junit для тестирования кода, связанного с Dao, с помощью hsqldb (2.3.3). Система использует mybatis для сохранения данных.

В mybatisXXsql.xml есть свойство "fetchSize" в операторе выбора, например:

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

Пока мы вызывали проверенный sql с hsqldb, он показал следующее исключение:

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 голосов
/ 02 ноября 2018

Отрицательное fetchSize - не поддерживается JDBC. Вот описание исключений, которые setFetchSize выбрасывает:

SQLException - если возникает ошибка доступа к базе данных, этот метод вызывается в закрытом операторе или строки условий> = 0 не выполняются.

Причиной ошибки является неправильный размер выборки (outOfRangeArgument в трассировке стека также предполагает это).

Драйвер mysql поддерживает Integer.MIN_INT в качестве размера выборки, чтобы указать, что набор результатов находится в режиме потоковой передачи:

Комбинация прямого и только для чтения результирующего набора с размером выборки Integer.MIN_VALUE служит сигналом для драйвера для потоковой передачи результирующих наборов построчно. После этого любые результирующие наборы, созданные с помощью оператора, будут извлекаться построчно.

mybatis сам по себе не позволяет параметризовать fetchSize в конфигурации картографа.

Вам необходимо использовать некоторые приемы для переопределения конфигурации с помощью AspectJ или PowerMock. С PowerMock вы можете использовать PowerMock.stub, чтобы сделать что-то подобное, прежде чем вызывать метод, выполняющий запрос:

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

Таким образом, когда mybatis создаст Statement, он будет использовать фиктивное значение для fetchSize

...