ResultSetImpl создает исключение NullPointerException

Я использую MySQL 5.5 с разъемом MySQL 5.1.18. простой запрос стиля

select * from my_table where column_a in ('aaa','bbb',...) and column b=1;

выполняется из приложения Java. запрос возвращает набор из 25 тыс. строк по 8 столбцов в каждой. при чтении результатов в цикле while

while(rs.next())
{
    MyObject c= new MyObject();  
    c.setA(rs.getString("A"));
    c.setB(rs.getString("B"));
    c.setC(rs.getString("C"));
    ...
}

следующее исключение выдается, как правило, во время первых циклов, но никогда в одной строке:

java.lang.NullPointerException
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5720)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5610)

я взглянул на исходный код в ResultSetImpl.java:5720 и вижу следующее:

switch (metadata.getSQLType())

где метаданные

Field metadata = this.fields[internalColumnIndex];

и getSQLType - это не требующий логики метод получения, возвращающий int. Интересно то, что один и тот же объект метаданных многократно вызывается несколькими строками выше с другими получателями и не вызывает исключений.

Кстати, с запросом, указанным выше, проблем нет, пока он выполняется непосредственно в mysql. Приложение работает в AWS.

есть идеи как это решить? Благодарю.

2 ответа

Я столкнулся с этой проблемой, используя Spring Data CrudRepository, получая поток результатов из базы данных MySql, работающей на AWS RDS, с умеренно сложным запросом.

Это также бросило бы в недетерминированную строку после приблизительно 30 000 строк.

Я решил эту проблему, пометив вызывающий метод с помощью @Transactional.

Хотя вы не используете JPA, настройка транзакции для доступа к базе данных может помочь в вашей проблеме.

По моему опыту, эта ошибка является результатом заблокированной таблицы при попытке чтения / записи одновременно из одной и той же таблицы. Вам нужно добавить пул для каждого запроса или некоторое время ожидания между каждой операцией в MySQL.

Также связанный ответ: Получение java.sql.SQLException: операция не разрешена после закрытия ResultSet

Другие вопросы по тегам