Я использую activerecord с em_mysql2 под Goliath (eventmachine). Самое странное происходит с моей моделью User. Когда я делаю 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 не был полностью поддерживаемой конфигурацией. (Хотя с того времени может быть достигнут некоторый прогресс)