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