2009-04-09 11 views
2

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

  1. Открывает соединение с базой данных через сеть
  2. Выполнить запрос в базе данных с помощью SQL Statement
  3. Analysis данные, полученный из базы данных
  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?

+0

Не могли бы вы прояснить, что вы подразумеваете под DBIX, пожалуйста? Это полное пространство имен, полное модулей (DBIx: :) или что-то еще? – castaway

+0

Я имею в виду: http://search.cpan.org/dist/DBIx-Class/lib/DBIx/Class.pm –

ответ

0

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

4

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

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

1

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

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

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