В настоящее время я запрашиваю огромную таблицу Firebird (v2.5) (с миллионами строк) для выполнения некоторых операций на уровне строк. Чтобы достичь этого, код использует чанкинг из Laravel 5.1, примерно так:
DB::connection('USER_DB')
->table($table->name)
->chunk(min(5000, floor(65500/count($table->fields))), function($data) {
// running code and saving
});
По какой-то причине я продолжаю получать следующую ошибку:
SQLSTATE [HY000]: общая ошибка: -902 Ошибка чтения данных из соединения.
Я уже пытался изменить размер чанка и другие коды, но ошибка все еще появляется. Иногда это происходит в начале таблицы, а иногда после анализа нескольких сотен тысяч или даже миллионов строк. Дело в том, что мне нужно проанализировать только строки в этой транзакции (поэтому я не могу остановить и снова открыть скрипт).
Проверено на наличие памяти на сервере (работающей в другом месте, чем база данных), и она почти ничего не использует.
При написании этого я перепроверил журнал Firebird и нашел следующую запись:
INET / inet_error: прочитайте errno = 10054
Насколько я понял, это не проблема Firebird, а ошибка сброса winsock, это правильно? Если так, как я мог предотвратить это во время запроса чанка? И как я могу проверить, если это проблема с Windows или брандмауэром?
Обновить я
Копаясь в firebird2.5.log на PHP-сервере, обнаружил следующие ошибки:
INET / inet_error: отправьте errno = 104
УДАЛЕННЫЙ ИНТЕРФЕЙС / gds__detach: неудачное отсоединение от базы данных.
Я нашел корень моей проблемы. Дело в том, что сервер сбрасывал соединение. Чтобы избежать этого, я добавил запрос «сердцебиение» для запуска каждые несколько минут. С помощью этой стратегии я смог предотвратить сброс соединения.
Других решений пока нет …