> PH> Don't open a connection during startup.  If you do, it will be shared when
> PH> Apache forks, and sharing a database handle is bad for the same reasons
> PH> sharig a file handle is.  Open a connection in the child process instead.

I will second this. I've done this (unintentionally) when using MySQL, and
you get a lot of weird errors about statement handles being active, etc.

> Speaking of which, what does one do when Apache::DBI is loaded, and
> the parent process needs to pull some config info out of the database
> that all clients also use?  That is, how can I force Apache::DBI to
> close that handle prior to the forking of children?

By using the magic 6th arg ($connect_meth in the DBI::connect source) to
DBI::connect. In my DB wrapper I have a connect method that internally calls
DBI::connect; before doing so, it checks to see if it is being called while
Apache is starting up in the parent process, and if so, it uses this special
arg.

    my @args = ("dbi:$db->{driver}:$dbname", $user, $pass,
       { RaiseError => 1 });
    push @args, (undef, 'connect')
        if $Apache::Server::Starting or $Visius::httpd_conf::Loading;

    $self->{handle} = DBI->connect(@args);

The 'connect' is that magic argument that forces DBI to use its standard
connect method, rather than Apache::DBI::connect, when creating the new db
handle. This means that it is essentially a use-once DB handle, and that it
will not be reused by Apache::DBI.

Does this help?

bye,
Ben

Reply via email to