The Following example shows how to change an existing $schema to a replicated
storage type, add some replicated (readonly) databases, and perform reporting
-tasks
+tasks.
## Change storage_type in your schema class
$schema->storage_type( '::DBI::Replicated' );
## Add some slaves. Basically this is an array of arrayrefs, where each
## arrayref is database connect information
- $schema->storage->create_replicants(
+ $schema->storage->connect_replicants(
[$dsn1, $user, $pass, \%opts],
[$dsn1, $user, $pass, \%opts],
[$dsn1, $user, $pass, \%opts],
- ## This is just going to use the standard DBIC connect method, so it
- ## supports everything that method supports, such as connecting to an
- ## existing database handle.
- [$dbh],
- \%global_opts
);
- ## a hash of replicants, keyed by their DSN
- my %replicants = $schema->storage->replicants;
- my $replicant = $schema->storage->get_replicant($dsn);
- $replicant->status;
- $replicant->is_active;
- $replicant->active;
-
=head1 DESCRIPTION
Warning: This class is marked ALPHA. We are using this in development and have
txn_rollback
sth
deploy
+ schema
/],
);
attribute has methods to help you shuffle through all the available replicants
via it's balancer object.
-This attribute defines the following reader/writer methods
-
-=over 4
-
-=item get_current_replicant
-
-Returns the contained L<DBIx::Class::Storage::DBI> replicant
-
-=item set_current_replicant
-
-Set the attribute to a given L<DBIx::Class::Storage::DBI> (or subclass) object.
-
-=back
-
We split the reader/writer to make it easier to selectively override how the
replicant is altered.
has 'current_replicant' => (
is=> 'rw',
- reader=>'get_current_replicant',
- writer=>'set_current_replicant',
isa=>'DBIx::Class::Storage::DBI',
lazy_build=>1,
handles=>[qw/
handles=>[qw/
replicants
has_replicants
- create_replicants
+ connect_replicants
num_replicants
delete_replicant
/],
}
-=head2 after: get_current_replicant_storage
+=head2 around: create_replicants
+
+All calls to create_replicants needs to have an existing $schema tacked onto
+top of the args
+
+=cut
+
+around 'connect_replicants' => sub {
+ my ($method, $self, @args) = @_;
+ $self->$method($self->schema, @args);
+};
+
+
+=head2 after: select, select_single, columns_info_for
Advice on the current_replicant_storage attribute. Each time we use a replicant
we need to change it via the storage pool algorithm. That way we are spreading
=cut
-after 'get_current_replicant' => sub {
+after 'select' => sub {
my $self = shift @_;
my $next_replicant = $self->next_storage($self->pool);
-
- $self->set_current_replicant($next_replicant);
+
+ $self->current_replicant($next_replicant);
};
+after 'select_single' => sub {
+ my $self = shift @_;
+ my $next_replicant = $self->next_storage($self->pool);
+
+ $self->current_replicant($next_replicant);
+};
+
+after 'columns_info_for' => sub {
+ my $self = shift @_;
+ my $next_replicant = $self->next_storage($self->pool);
+
+ $self->current_replicant($next_replicant);
+};
=head2 all_storages
## Other standard DBI connection or DBD custom attributes added as
## usual. Additionally, we have two custom attributes for defining
## slave information and controlling how the underlying DBD::Multi
- slaves_connect_info => [
+ connect_replicants => [
## Define each slave like a 'normal' DBI connection, but you add
## in a DBD::Multi custom attribute to define how the slave is
## prioritized. Please see DBD::Multi for more.
- [$slave1dsn, $user, $password, {%slave1opts, priority=>10}],
- [$slave2dsn, $user, $password, {%slave2opts, priority=>10}],
- [$slave3dsn, $user, $password, {%slave3opts, priority=>20}],
- ## add in a preexisting database handle
- [$dbh, '','', {priority=>30}],
- ## DBD::Multi will call this coderef for connects
- [sub { DBI->connect(< DSN info >) }, '', '', {priority=>40}],
- ## If the last item is hashref, we use that for DBD::Multi's
- ## configuration information. Again, see DBD::Multi for more.
- {timeout=>25, failed_max=>2},
+ [$slave1dsn, $user, $password, {%slave1opts}],
+ [$slave2dsn, $user, $password, {%slave2opts}],
+ [$slave3dsn, $user, $password, {%slave3opts}],
],
},
);