You are viewing a plain text version of this content. The canonical link for it is here.
Posted to docs-cvs@perl.apache.org by st...@apache.org on 2002/05/09 12:34:43 UTC
cvs commit: modperl-docs/src/docs/1.0/guide Changes.pod databases.pod
stas 02/05/09 03:34:43
Modified: src/docs/1.0/guide Changes.pod databases.pod
Log:
o correct the notes regarding "Opening Connections With Different
Parameters" for Apache::DBI. Must localize local changes.
Revision Changes Path
1.17 +5 -0 modperl-docs/src/docs/1.0/guide/Changes.pod
Index: Changes.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/Changes.pod,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
--- Changes.pod 5 May 2002 18:22:33 -0000 1.16
+++ Changes.pod 9 May 2002 10:34:43 -0000 1.17
@@ -11,6 +11,11 @@
=head1 ??? ver 1.32
+* guide::databases
+
+ o correct the notes regarding "Opening Connections With Different
+ Parameters" for Apache::DBI. Must localize local changes.
+
* guide::getwet
o a new chapter to get you started fast
1.9 +99 -7 modperl-docs/src/docs/1.0/guide/databases.pod
Index: databases.pod
===================================================================
RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/databases.pod,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- databases.pod 28 Apr 2002 09:20:29 -0000 1.8
+++ databases.pod 9 May 2002 10:34:43 -0000 1.9
@@ -199,18 +199,110 @@
172800 seconds is equal to 48 hours. This change solves the problem,
but the ping() method works properly in C<DBD::mysql> as well.
-=head3 Opening connections with different parameters
+=head3 Opening Connections With Different Parameters
-When it receives a connection request, before it decides to use an
-existing cached connection, C<Apache::DBI> insists that the new
+When C<Apache::DBI> receives a connection request, before it decides
+to use an existing cached connection it insists that the new
connection be opened in exactly the same way as the cached
-connection. If I have one script that sets C<LongReadLen> and one that
-does not, C<Apache::DBI> will make two different connections. So instead
-of having a maximum of 40 open connections, I can end up with 80.
+connection. If you have one script that sets C<AutoCommit> and one
+that does not, C<Apache::DBI> will make two different connections. So
+if for example you have limited Apache to 40 servers at most, instead
+of having a maximum of 40 open connections you may end up with 80.
+
+So these two connect() calls will create two different connections:
+
+ my $dbh = DBI->connect
+ ("DBI:mysql:test:localhost", '', '',
+ {
+ PrintError => 1, # warn() on errors
+ RaiseError => 0, # don't die on error
+ AutoCommit => 1, # commit executes immediately
+ }
+ ) or die "Cannot connect to database: $DBI::errstr";
+
+ my $dbh = DBI->connect
+ ("DBI:mysql:test:localhost", '', '',
+ {
+ PrintError => 1, # warn() on errors
+ RaiseError => 0, # don't die on error
+ AutoCommit => 0, # don't commit executes immediately
+ }
+ ) or die "Cannot connect to database: $DBI::errstr";
+
+Notice that the only difference is in the value of C<AutoCommit>.
However, you are free to modify the handle immediately after you get
it from the cache. So always initiate connections using the same
-parameters and set C<LongReadLen> (or whatever) afterwards.
+parameters and set C<AutoCommit> (or whatever) afterwards. Let's
+rewrite the second connect call to do the right thing (not to create
+a new connection):
+
+ my $dbh = DBI->connect
+ ("DBI:mysql:test:localhost", '', '',
+ {
+ PrintError => 1, # warn() on errors
+ RaiseError => 0, # don't die on error
+ AutoCommit => 1, # commit executes immediately
+ }
+ ) or die "Cannot connect to database: $DBI::errstr";
+ $dbh->{AutoCommit} = 0; # don't commit if not asked to
+
+When you aren't sure whether you're doing the right thing, turn debug
+mode on.
+
+However, when the C<$dbh> attribute is altered after connect() it
+affects all other handlers retrieving this database handle. Therefore
+it's best to restore the modified attributes to their original value
+at the end of database handle usage. As of C<Apache::DBI> version 0.88
+the caller has to do it manually. The simplest way to handle this is
+to localize the attributes when modifying them:
+
+ my $dbh = DBI->connect(...) ...
+ {
+ local $dbh->{LongReadLen} = 40;
+ }
+
+Here the C<LongReadLen> attribute overrides the value set in the
+connect() call or its default value only within the enclosing block.
+
+The problem with this approach is that prior to Perl version 5.8.0
+this causes memory leaks. So the only clean alternative for older Perl
+versions is to manually restore the C<dbh>'s values:
+
+ my @attrs = qw(LongReadLen PrintError);
+ my %orig = ();
+
+ my $dbh = DBI->connect(...) ...
+ # store the values away
+ $orig{$_} = $dbh->{$_} for @attrs;
+ # do local modifications
+ $dbh->{LongReadLen} = 40;
+ $dbh->{PrintError} = 1;
+ # do something with the filehandle
+ # ...
+ # now restore the values
+ $dbh->{$_} = $orig{$_} for @attrs;
+
+Another thing to remember is that with some database servers it's
+possible to access more than one database using the same database
+connection. MySQL is one of those servers. It allows you to use a
+fully qualified table specification notation. So if there is a
+database I<foo> with a table I<test> and database I<bar> with its own
+table I<test>, you can always use:
+
+ SELECT from foo.test ...
+
+or:
+
+ SELECT from bar.test ...
+
+So no matter what database you have used in the database name string
+in the connect() call (e.g.: C<DBI:mysql:foo:localhost>) you can still
+access both tables by using a fully qualified syntax.
+
+Alternatively you can switch databases with C<USE foo> and C<USE bar>,
+but this approach seems less convenient, and therefore error-prone.
+
=head3 Cannot find the DBI handler
---------------------------------------------------------------------
To unsubscribe, e-mail: docs-cvs-unsubscribe@perl.apache.org
For additional commands, e-mail: docs-cvs-help@perl.apache.org