Это плохая идея, чтобы открыть отдельное соединение MySQL в среде Rails? - PullRequest
2 голосов
/ 26 января 2009

Я в ситуации, когда мне нужно вызвать хранимую процедуру из Rails. Я могу это сделать, но он либо разрывает соединение MySQL, либо является псевдо-хаком, который требует странных изменений в хранимых процессах . Кроме того, псевдо-хак не может возвращать большие наборы данных.

Сейчас мое решение - использовать system() и напрямую вызывать командную строку mysql. Я думаю, что менее печальным решением было бы открыть мое собственное соединение MySQL независимо от соединения Active Record.

Я не знаю ни одной причины, почему это было бы плохо. Но я также недостаточно хорошо знаю внутренности MySQL, чтобы знать, что он на 100% безопасен.

Это решило бы мою проблему аккуратно, потому что с действиями контроллера, которые должны вызвать хранимый процесс, открылось бы новое соединение с базой данных, сделать вызов и закрыть его. Я мог бы пожертвовать некоторой производительностью, но если это работает, этого достаточно. Это также решает проблему нескольких пользователей в одном процессе (мы используем mongrel, в настоящее время) в пограничных рельсах, где теперь, наконец, потокобезопасен, так как для взлома требуется два SQL-запроса, и я не могу гарантировать, что использую такое же соединение с базой данных через Active Record.

Итак, это плохая идея и / или опасная?

Ответы [ 3 ]

3 голосов
/ 26 января 2009

Ruby on Rails обычно отказывается от хранимых процедур или от реализации любой другой бизнес-логики в базе данных. Кто-то может сказать, что вы не следуете "путям Rails", чтобы сначала вызывать хранимый процесс.

Но если вы должны вызвать сохраненный процесс, IMO, открывающее второе соединение из Ruby, должно быть предпочтительнее, чем оболочка с system(). Последний метод в любом случае откроет второе соединение с MySQL, а также будет сопряжен с разгрузкой процесса запуска клиента mysql.

Вы должны проверить « Рецепты предприятия с Ruby и Rails » Майка Шмидта. В нем есть глава о вызове хранимых процедур из Rails.

MySQL может обрабатывать более одного соединения на запрос, хотя это увеличит нагрузку на сервер базы данных. Вам следует открыть второе соединение «ленивым» образом, только если вы уверены, что оно вам нужно по заданному запросу.

В любом случае, если бы производительность была важна в этом приложении, вы бы не использовали Rails! > :-)

(шучу!)

2 голосов
/ 26 января 2009

Учитывая, что RoR тесно связан с его собственным представлением об использовании базы данных, вы, вероятно, должны открыть второе соединение с базой данных для любого взаимодействия, которое вам не удается, только для целей SoC, если ничего не происходит остальное. Из вашего описания это звучит так, как будто это также самый простой подход, который обычно является сильным положительным знаком.

Приложения из других языков (например, PHP) регулярно открывают несколько соединений (что не делает этого желательным, но, по крайней мере, демонстрирует, что mysql не будет возражать).

0 голосов
/ 16 февраля 2009

Мы с тех пор попробовали последнюю версию mysql gem из github, и даже это не решило проблему.

Мы исправили адаптер mysql в Rails, и это действительно работает. Все, что нужно сделать, это убедиться, что соединение MySQL больше не дает результатов, прежде чем продолжить.

Я пока не принимаю этот ответ, потому что я не на 100% чувствую, что это хорошее решение. Мы не сделали достаточно тестирование. Но я хотел показать это кому-нибудь еще, кто смотрит на этот вопрос.

...