Ich habe keine Erfahrung mit DBIx :: Verbindung, aber ich benutze DBIx::Connector (im Wesentlichen, was DBIx :: Klasse intern verwendet, aber inlined) und es ist wunderbar ...
I bündeln diese Verbindungen mit einem Elch Objekt-Wrapper, die identisch sind, wenn die Verbindungsparameter bestehende Objektinstanzen Hände zurück (dies würde das gleiche für all zugrunde liegendes DB-Objekt arbeitet):
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;
}
Ich benutze DBIx :: Connector (was DBIx :: Class verwendet intern) und es ist wunderbar ... Ich bündle diese Verbindungen mit einem Moose-Objekt-Wrapper, der vorhandene Objektinstanzen zurückgibt, wenn die Verbindungsparameter identisch sind. Es ist nicht schwer, selbst zu rollen. – Ether
@Ether - eine Antwort wert, IMHO – DVK
@DVK: ok, ich erweiterte dies mit einer Antwort ... – Ether