Я использую activerecord с em_mysql2 под Goliath (eventmachine). Самое странное происходит с моей моделью пользователя. Когда я делаю POST для /users в первый раз, все работает, как и ожидалось. Когда я делаю второй POST, я получаю сообщение об ошибке.
Mysql2::Error: This connection is still waiting for a result, try again once you have the result: INSERT INTO `users` (... and so on ...)
Этого не происходит ни с одной из моих моделей или маршрутов. Я бы предположил, что если соединение с БД находится в испорченном состоянии, я увижу ту же ошибку в других запросах, но нет - все остальные запросы на обновление БД и запросы GET работают нормально.
Кто-нибудь понимает, как это могло случиться только для моей модели Users и только для действия User.save? Сохраняет ли активная запись какое-то соединение с БД, которое она использовала для выполнения Model.save, и повторно использует его?
ИЗМЕНИТЬ:
Я почему-то не упомянул, когда писал этот вопрос, что использую ActiveRecord в качестве ORM. Я также не упомянул, что асинхронно отправлял запрос в базу данных Mongo для получения информации об аутентификации пользователя.
Мое решение:
Оказывается, эта ошибка могла возникнуть только в том случае, когда ответ от Mongo вернулся раньше, чем ответ от MySQL, что привело к тому, что ответ MySQL был получен другим волокном, а не тем, который сделал запрос. Поскольку реализация волокна MySQL2, которую я использовал, использовала objectID волокна для управления соединениями, это, похоже, вызвало проблему.
Общий пул соединений в ActiveRecord + MySql2 + Fibers + Goliath не был полностью поддерживаемой конфигурацией. (Хотя с тех пор может быть некоторый прогресс)