X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FReplicated.pm;h=6302bf1ebac360671bb02075f28ab3ebcd8e66c3;hb=212cc5c25c31b2ec3ff4b4e20283321617db79e6;hp=259cdc52bf777de0ad4c84145e316d5c81309e35;hpb=0ce2d0d584bda471de28f1deec96abcd6254cc3f;p=dbsrgits%2FDBIx-Class-Historic.git diff --git a/lib/DBIx/Class/Storage/DBI/Replicated.pm b/lib/DBIx/Class/Storage/DBI/Replicated.pm index 259cdc5..6302bf1 100644 --- a/lib/DBIx/Class/Storage/DBI/Replicated.pm +++ b/lib/DBIx/Class/Storage/DBI/Replicated.pm @@ -7,11 +7,11 @@ BEGIN { ## use, so we explicitly test for these. my %replication_required = ( - Moose => '0.77', - MooseX::AttributeHelpers => '0.12', - MooseX::Types => '0.10', - namespace::clean => '0.11', - Hash::Merge => '0.11' + 'Moose' => '0.77', + 'MooseX::AttributeHelpers' => '0.12', + 'MooseX::Types' => '0.10', + 'namespace::clean' => '0.11', + 'Hash::Merge' => '0.11' ); my @didnt_load; @@ -48,11 +48,15 @@ The Following example shows how to change an existing $schema to a replicated storage type, add some replicated (readonly) databases, and perform reporting tasks. - ## Change storage_type in your schema class +You should set the 'storage_type attribute to a replicated type. You should +also defined you arguments, such as which balancer you want and any arguments +that the Pool object should get. + $schema->storage_type( ['::DBI::Replicated', {balancer=>'::Random'}] ); - ## Add some slaves. Basically this is an array of arrayrefs, where each - ## arrayref is database connect information +Next, you need to add in the Replicants. Basically this is an array of +arrayrefs, where each arrayref is database connect information. Think of these +arguments as what you'd pass to the 'normal' $schema->connect method. $schema->storage->connect_replicants( [$dsn1, $user, $pass, \%opts], @@ -60,20 +64,28 @@ tasks. [$dsn3, $user, $pass, \%opts], ); - ## Now, just use the $schema as normal +Now, just use the $schema as you normally would. Automatically all reads will +be delegated to the replicants, while writes to the master. + $schema->resultset('Source')->search({name=>'etc'}); - ## You can force a given query to use a particular storage using the search - ### attribute 'force_pool'. For example: +You can force a given query to use a particular storage using the search +attribute 'force_pool'. For example: my $RS = $schema->resultset('Source')->search(undef, {force_pool=>'master'}); - - ## Now $RS will force everything (both reads and writes) to use whatever was - ## setup as the master storage. 'master' is hardcoded to always point to the - ## Master, but you can also use any Replicant name. Please see: - ## L and the replicants attribute for - ## More. Also see transactions and L for alternative ways - ## to force read traffic to the master. + +Now $RS will force everything (both reads and writes) to use whatever was setup +as the master storage. 'master' is hardcoded to always point to the Master, +but you can also use any Replicant name. Please see: +L and the replicants attribute for more. + +Also see transactions and L for alternative ways to +force read traffic to the master. In general, you should wrap your statements +in a transaction when you are reading and writing to the same tables at the +same time, since your replicants will often lag a bit behind the master. + +See L for more help and +walkthroughs. =head1 DESCRIPTION @@ -153,7 +165,7 @@ has 'pool_type' => ( =head2 pool_args Contains a hashref of initialized information to pass to the Balancer object. -See L for available arguments. +See L for available arguments. =cut @@ -186,7 +198,7 @@ has 'balancer_type' => ( =head2 balancer_args Contains a hashref of initialized information to pass to the Balancer object. -See L for available arguments. +See L for available arguments. =cut @@ -288,7 +300,8 @@ has 'write_handler' => ( create_ddl_dir deployment_statements datetime_parser - datetime_parser_type + datetime_parser_type + build_datetime_parser last_insert_id insert insert_bulk @@ -303,10 +316,19 @@ has 'write_handler' => ( sth deploy with_deferred_fk_checks - + dbh_do reload_row + with_deferred_fk_checks _prep_for_execute - + + backup + is_datatype_numeric + _count_select + _subq_count_select + _subq_update_delete + svp_rollback + svp_begin + svp_release /], ); @@ -366,10 +388,11 @@ around connect_info => sub { $res = $self->$next($info, @extra); } - # May have to reapply role if master will be reblessed to a more specific - # driver. - $self->master->_determine_driver; - DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($self->master); + # Make sure master is blessed into the correct class and apply role to it. + my $master = $self->master; + $master->_determine_driver; + Moose::Meta::Class->initialize(ref $master); + DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master); $wantarray ? @res : $res; }; @@ -405,7 +428,6 @@ Lazy builder for the L attribute. sub _build_master { my $self = shift @_; my $master = DBIx::Class::Storage::DBI->new($self->schema); - DBIx::Class::Storage::DBI::Replicated::WithDSN->meta->apply($master); $master } @@ -612,24 +634,11 @@ writea are sent to the master only sub set_balanced_storage { my $self = shift @_; my $schema = $self->schema; - my $write_handler = $self->schema->storage->balancer; + my $balanced_handler = $self->schema->storage->balancer; - $schema->storage->read_handler($write_handler); + $schema->storage->read_handler($balanced_handler); } -=head2 around: txn_do ($coderef) - -Overload to the txn_do method, which is delegated to whatever the -L is set to. We overload this in order to wrap in inside a -L method. - -=cut - -around 'txn_do' => sub { - my($txn_do, $self, $coderef, @args) = @_; - $self->execute_reliably(sub {$self->$txn_do($coderef, @args)}); -}; - =head2 connected Check that the master and at least one of the replicants is connected.