На Perl Пул Соединений
прямо сейчас у нас есть большое приложение perl, которое использует raw DBI для подключения к MySQL и выполнения инструкций SQL. Он создает соединение каждый раз и заканчивается. Начали приближаться к пределу соединения mysql (200 сразу)
похоже DBIx:: Connection поддерживает объединение соединений прикладного уровня.
у кого-нибудь был опыт работы с DBIx::Connection
?. Существуют ли какие-либо другие соображения для объединения соединений?
I Также см. mod_dbd
который является модом Apache, который выглядит как он обрабатывает пул соединений.
http://httpd.apache.org/docs/2.1/mod/mod_dbd.html
2 ответов
У меня нет опыта работы с DBIx:: Connection, но я использую DBIx:: Connector (по существу, что DBIx:: Class использует внутренне, но inlined), и это замечательно...
я объединяю эти соединения с оболочкой объекта Moose, которая возвращает существующие экземпляры объекта, если параметры соединения идентичны (это будет работать одинаково для любого базового объекта DB):
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()
, да? Это drop-in замена для connect()
это повторно использует dbh, где это возможно, в течение жизни вашего скрипта perl. Возможно, ваша проблема разрешима, добавив 7 символов:)
и, соединения MySQL относительно дешевы. Работает с вашей БД на max_connections=1000
или больше сами по себе не вызовут проблем. (Если ваши клиенты требуют больше работы, чем может справиться ваша БД, это более серьезная проблема, которая ниже max_connections
может поставить но, конечно, не решить.)