[Dancer-users] Using persistent DB connections in Dancer::Tutorial

Jeff McCarrell jwm at emptech.com
Wed Jan 12 01:17:18 CET 2011


On Jan 10, 2011, at 4:53 AM, David Precious wrote:

> A single connection per process, I believe.  For instance, if you run it


N.B. I can't speak for Starman or other deployments as I have no experience.  But for straight mod_perl & DBI:

Certainly a single connection per process is the right model under a straight mod_perl / DBI model.
The idiom I use is:

our $dbh;              # DBI
  ....

In every request:
    $dbh      = db_connect()                  unless $dbh;

where db_connect() does the usual DBI->connect() and returns the handle.

If you try to reuse the DBI handle across fork(), then DBI itself will start throwing errors, 
subject to DBI's RaiseError / PrintError configuration.

In other words, allocate a global handle for the DBI connection, and initialize it by opening it.
Don't fork and reuse the global handle without re-opening it in the child.

The only way to get into trouble is the DBI handle gets initialized before the child forks.
This means if I need to read state from the DB that I want inherited by all children,
then in the function called at httpd init time, I open the db, read the state into ram, 
then  close $dbh and undef it.

You also may find this DBI & mod_perl info helpful as the DBI persistence issue is pretty well covered:

http://modperlbook.org/html/20-1-Persistent-Database-Connections-with-Apache-DBI.html
http://dbi.perl.org/docs/

HTH,

-- jeff



More information about the Dancer-users mailing list