package MyDBI; use strict; use DBI; use DBD::mysql; use vars qw(@ISA); @ISA = qw(DBI); sub connect { my $self = shift; my ($dsn, $uname, $passwd) = @_; my $this = $class->SUPER::connect($dsn, $uname, $passwd); $this->set_dsn ($dsn, $uname, $passwd); # so I can reconnect easily return $this; } package MyDBI::db; @MyDBI::db::ISA = qw(DBI::db); my ($_uname, $_passwd, $_dsn); sub set_dsn { my $this = shift; ($_dsn, $_uname, $_passwd) = @_; } sub reconnect { # somthing like MyDBI->connect ($_dsn, $_uname, $_passwd); # and then rerun prepare } package MyDBI::st; @MyDBI::st::ISA = qw(DBI::st); sub execute { my $this = shift; $this->SUPER::execute (@_); if ($this->errstr =~ /server has gone away/) { MyDBI::db->reconnect; # and then rerun execute with some sleep to avoid insane bahviour } } 1; #### use MyDBI; my $dbh= MyDBI->connect (...); my $sth = $dbh->prepare ("select now()"); sleep (10); # while sleeping the db goes away $sth->execute; # at this point MyDBI is supposed to reconnect and rerun prepare/execute