Прямо сейчас у нас есть большое приложение жемчуга, которое использует необработанный DBI, чтобы соединиться с MySQL и выполнить SQL-операторы. Это создает соединение каждый раз и завершается. Запуск должен был приблизиться к ограничению соединения mysql (200 сразу)
Это похоже на DBIx:: Соединение поддерживает организацию пула подключений прикладного уровня.
Имеет кого-либо, имел любой опыт с DBIx::Connection
?. Есть ли какие-либо другие соображения для организации пула подключений?
Я также вижу mod_dbd
то, которое является модификацией Apache, которая похожа на него, обрабатывает организацию пула подключений. http://httpd.apache.org/docs/2.1/mod/mod_dbd.html
У меня нет опыта работы с DBIx :: Connection, но я использую DBIx :: Connector (по сути, то, что DBIx :: Class использует внутри, но встроено) и это замечательно ...
Я объединяю эти соединения с оболочкой объекта Moose, которая возвращает существующие экземпляры объекта, если параметры соединения идентичны (это будет работать одинаково для любого базового объекта БД):
package MyApp::Factory::DatabaseConnection;
use strict;
use warnings;
use Moose;
# table of database name -> connection objects
has connection_pool => (
is => 'ro', isa => 'HashRef[DBIx::Connector]',
traits => ['Hash'],
handles => {
has_pooled_connection => 'exists',
get_pooled_connection => 'get',
save_pooled_connection => 'set',
},
default => sub { {} },
);
sub get_connection
{
my ($self, %options) = @_;
# some application-specific parsing of %options here...
my $obj;
if ($options{reuse})
{
# extract the last-allocated connection for this database and pass it
# back, if there is one.
$obj = $self->get_pooled_connection($options{database});
}
if (not $obj or not $obj->connected)
{
# look up connection info based on requested database name
my ($dsn, $username, $password) = $self->get_connection_info($options{database});
$obj = DBIx::Connector->new($dsn, $username, $password);
return unless $obj;
# Save this connection for later reuse, possibly replacing an earlier
# saved connection (this latest one has the highest chance of being in
# the same pid as a subsequent request).
$self->save_pooled_connection($options{database}, $obj) unless $options{nosave};
}
return $obj;
}
Просто убедитесь: вы знаете о DBI-> connect_cached ()
, верно? Это прямая замена для connect ()
, которая повторно использует dbh, где это возможно, в течение всего срока службы вашего Perl-скрипта. Возможно, вашу проблему можно решить, добавив 7 символов :)
И соединения MySQL относительно дешевы. Работа с вашей БД при max_connections = 1000
или более сама по себе не вызовет проблем. (Если вашим клиентам требуется больше работы, чем может обработать ваша БД, это более серьезная проблема, которую можно отложить при более низком max_connections
, но, конечно, не решить.)