Как я могу иметь постоянное соединение с базой данных DBIC в mod_perl? - PullRequest
2 голосов
/ 09 апреля 2009

Я использую mod_perl для своего веб-приложения. В настоящее время я планирую использовать базу данных mysql в сети. В каждом CGI-запросе к display_customer_transaction.cgi мой скрипт будет

  1. Открытие подключения к базе данных по сети
  2. Выполнение запроса к базе данных с помощью оператора SQL
  3. Анализ данных, извлеченных из базы данных
  4. Распечатать данные в формате HTML
  5. Закрыть соединение с базой данных

После некоторого профилирования я понимаю, что шаг (1) является узким местом. Следовательно, я хочу избежать открытия и закрытия соединения с базой данных для каждого запроса CGI. Мое желание: если мой первый запрос CGI открывает соединение с базой данных, мой второй входящий запрос CGI (от другого клиента) может повторно использовать первое соединение с базой данных.

Я пытался использовать Google для "Соединения с постоянными базами данных DBIX", но вряд ли нашел подходящий результат. (Изменить: это потому, что он называется DBIC, или DBIx :: Class, а не DBIX.)

Я также нахожу для соответствующей информации, используя Apache :: DBI (Однако, я собираюсь использовать DBIX, а не Apache :: DBI). Есть некоторая информация, которая смутила меня:

Модуль Apache :: DBI все еще имеет ограничение: он поддерживает постоянное соединение с базой данных для каждого процесса.

Все время моя концепция о том, как Apache обслуживает CGI-запрос, заключается в том, что

  1. Apache всегда будет порождать новый процесс для обслуживания входящего нового запроса CGI. Всякий раз, когда интерпретатор Perl заканчивает выполнение сценария Perl, процесс останавливается.

Итак, если модуль Apache :: DBI способен поддерживать постоянные подключения к базе данных только для каждого процесса, как мой второй запрос CGI может повторно использовать соединение, открытое первым запросом CGI?

Но вернись к моему первоначальному вопросу. Как я могу иметь постоянное соединение с базой данных DBIX в mod_perl?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2009

Попробуйте Apache :: DBI, прежде чем списывать его со счетов. Однако вы также хотите сделать свои CGI-скрипты постоянными. Если у вас есть ванильные программы CGI прямо сейчас, вы можете использовать параметры PerlRun или PerlRegistry, чтобы сделать их постоянными. Это, наряду с Apache :: DBI, должно делать эту работу. Конечно, каждый дочерний процесс имеет соединения DBI, но это не лишено смысла.

Дайте ему попробовать, прежде чем отказаться от него. :)

1 голос
/ 07 мая 2009

Apache :: DBI изменяет способ работы модуля DBI. Предполагая, что вы используете DBIx :: Class (вы не достаточно конкретны), он использует модуль DBI для получения соединений с БД, так что это будет работать для вас.

Когда вы используете mod_perl (и при условии, что ваша установка mod_perl верна), Perl-интерпретатор загружается в Apache, и ваша программа загружается в него. Apache запускает ограниченное количество процессов для обслуживания запросов - каждый из них обслуживает более одного запроса.

Процессы Apache в конечном итоге умирают и возрождаются, но они обслуживают множество запросов до того, как это произойдет. Это процессы, на которые ссылается документация Apache :: DBI; он пытается сказать: «Вы будете снова и снова использовать одно и то же соединение, но это не значит, что одновременно открыто только одно соединение».

0 голосов
/ 26 мая 2009

Наконец, я не использовал постоянное соединение в это время, поскольку оценка моего соединения в секунду очень низкая. Что касается плана масштабирования производительности, я бы предпочел использовать решение DBIx + memcache.

...