Your references are fine - the Database is the problem. Using Oracle we had a similar issue. We kind of narrowed it down to the following:
in reply to Why was it neccessary to pass a DBI handler by reference?
Create a $dbh.
Child disassociates from the parent.
Child's $dbh hopefully stays alive.
Parent's $dbh goes out of scope.
Parent's $dbh sends close signal to database.
Database sends signal that the connection was closed.
Child's $dbh gets signal that the connection was closed.
Child's $dbh closes.
Alternate possibility goes something like the parent signals that he is done and database closes the door on the child. Child tries to use the connection but the door is already closed - so the child closes its own $dbh.
There is lot of magic in DBI. There is a lot going on in the specific driver for your database. I'd be very careful about forking and trying to make you're own persistent connections or sharing the $dbh around.
In the end we found a way to disassociate the file descriptors so that the closing signals wouldn't be sent. Kind of a hack fix really.
my @a=qw(random brilliant braindead); print $a[rand(@a)];