Perl: fork, DBI and InactiveDestroy

Июнь 3rd, 2012 | Posted by self in Pensieve

I spent quite some time trying to figure how to make peace between Perl forks and DBI. It was clear that InactiveDestroy was supposed to be the solution, but making it work turned out to be tricky. Finally found a useful, and, importantly, working recipe here: (old stuff, but still good).

This is what {InactiveDestroy} is for:
When you open a database handle ($dbh) in a process, it contains a variety of database-specific state/connection information in it. When you fork a child process, you should never use the database handle ($dbh) which you opened in the parent process. This behavior is *not* defined to work by the DBI. It does work in some cases on *some* databases, but this is not supported behavior. Every process should have its own database handle.

The problem with this is that when you close the inherited database handle in the child process, it also shuts it down on the server side, thus rendering the handle unusable even in the parent process. So here’s the logic.

  • parent process opens a database handle
  • parent forks a child process
  • parent can continue using the open database handle safely as long as no child process uses it and no child process closes it “ungracefully”
  • child process immediately sets the {InactiveDestroy} attribute on the handle
  • child process deallocates the database handle (i.e. $dbh = undef;) but does *not* explicitly close the connection. This triggers the DESTROY method  on the database handle. Since the {InactiveDestroy} attribute is set, this causes the client-side state and connection information to be deallocated and shut down without telling the server to shut down the connection. this allows the parent process to continue to use the connection.
  • child opens its own connection to the database
  • child uses its own connection and closes it normally whenever it wishes

Here is the documentation from the DBI manual page.


You can follow any responses to this entry through the RSS 2.0 Both comments and pings are currently closed.