in reply to Sharing a database connection across fork()

See DBI, fork, and clone. (note the use of the clone function there). Other than that I've found conflicting information.

Even though I've found several places that say to set InactiveDestroy in the parent, I've also found several places that say instead to set it in each child, such as this PerlMonks post, as well as the DBI documentation on the option AutoInactiveDestroy.

It does seem safer to disconnect the handle in the parent and reconnect in the children (see e.g. this PerlMonks post). Also there's this post (pretty old) on a MySQL mailing list, which says "In other words, whether a connection can be used in a forked child, will almost definitely vary between database drivers and even versions."

Replies are listed 'Best First'.
Re^2: Sharing a database connection across fork()
by ibm1620 (Hermit) on Sep 12, 2014 at 19:28 UTC
    To summarize, here's what http://www.perlmonks.org/?node_id=594175 demonstrated, and what worked for me:

    (Parent) establish database connection in $dbh. (Parent) Fork. (Child) $dbh_child = $dbh->connect(inherited connection parameters); (Child) $dbh->{InactiveDestroy} = 1; (Child) undef $dbh; (Child) # proceed to use $dbh_child (Parent) # proceed to use $dbh (Child) exit; (Parent) # continue using $dbh
    (Note that I edited the above to replace the clone() call with a connect() call, as recommended by wrog.) Thanks to all!

      Current DBI docs claim use of clone() without an argument is deprecated (because there's some question of which attributes should be copied over, which may change, or something). No idea how likely they'll go through with it.

      Also, if the original connection specs are available then there's no reason not to just do a fresh connect() in the child (since that's what clone does anyway), i.e., you're not actually saving anything by inheriting it from the parent.

        I confirmed that I was able to replace the clone() call with a connect() call, using the connection specs inherited from the parent, as you suggested.