perl-modperl mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Vincent Veyron <>
Subject Re: Disconnect database connection after idle timeout
Date Fri, 14 Nov 2014 12:58:21 GMT
On Thu, 13 Nov 2014 17:40:05 -0500
Perrin Harkins <> wrote:

> No, that's perfect. Since pnotes gets cleaned up at the end of every
> request, there's no danger of the handle sticking around. I assume you're
> calling DBI->connect() to get the handle in the HeaderParser phase, and
> using Apache::DBI?
> The dangerous thing is to put a DBI handle in a global and just keep using
> it on every request. If you put a DBI handle in a global (or a closure
> variable) make sure you clean it up at the end of every request.

I have a package that returns a DBI handle when called, using connect_cached, without Apache::DBI
(see package Marica::db_handle below)

For each request I do :

In the PerlHeaderParserHandler

    my $dbh = Marica::db_handle::get_dbh_data( $database, $r->pnotes('session')->{preferred_datestyle}
) ;

    $r->pnotes( 'dbh' => $dbh ) ;

Then in the PerlResponseHandler

    my $dbh = $r->pnotes('dbh') ;

    my $data_set = $dbh->selectall_arrayref( $sql ) ;

It's very convenient, all my modules use this, and I only have one place to edit the database
connection if needed.
If I understand correctly, I could also use Apache::DBI and a persistent connection for a
similar result, modulo what you wrote in an earlier message regarding the connection being
more explicit (which I don't quite grasp, I'll have to study on that)?

package Marica::db_handle ;

use strict ;

use warnings ;

sub get_dbh_data {

    my $db_name = shift ;

    #param├Ętre d'affichage des dates; les caches de connection en tiennent compte
    my $preferred_datestyle = shift || 'iso' ;

    my $dbh = DBI->connect_cached( "DBI:Pg:dbname=$db_name", 'www-data', undef, {
	PrintError => 1,
    	RaiseError => 1,
    	AutoCommit => 1,
    	pg_bool_tf => 1,
	private_preferred_datestyle => $preferred_datestyle } )
    	or die "Cannot connect to db: $DBI::errstr" ;

    return $dbh ;


					Salutations, Vincent Veyron
Gestion des contentieux, des dossiers de sinistres assurance et des contrats pour le service

View raw message