Looks interesting, I'll give it a try... | [reply] |
Maybe you could clarify that technique a bit. I tried:
use Tie::Constrained;
# Other code as before, with and without SIG{__DIE__}
sub db_connect
{
my (
$dsn, # data source name
$error_msg # if any
);
# Set up connection string...
$dsn = "DBI:mysql:database=xxx;host=somehost;port=nn";
tie $cfg::dbh,
'Tie::Constrained' =>
{
test => sub {
$_[0]->isa('DBI::db')
and $_[0]->ping;
},
value => DBI->connect($dsn,
"user", "passwd",
#'DBI:mysql:','','',
{RaiseError => 0, AutoCommit => 1}),
fail => sub {
$_[1] = DBI->connect($dsn,
"user", "passwd",
{RaiseError => 0, AutoCommit => 1});
if( $DBI::errstr)
{
# FAIL
$error_msg = "db_connect(): $DBI::errs
+tr";
print "$error_msg\n";
$cfg::db_retry_cnt++;
if( !$cfg::db_cxn_msg_sent &&
$cfg::db_retry_cnt > 3 )
{
print "would have sent email/sms\n
+";
$cfg::db_cxn_msg_sent = 1;
}
}
else
{
# SUCCESS
$cfg::db_cxn_msg_sent = 0;
$cfg::db_retry_cnt = 0;
}
}
};
$Tie::Constrained::STRICT = 1;
}
Didn't quite understand the DB def for 'value' being empty in example, but tried it anyway, got 'DBD::mysql::st execute failed: No database selected' at each execute, so tried filling in with real values as above, and got same errors as in orig post, ending with 'Can't call method "quote" on an undefined value at ./pd.pl line 83', then perl died. | [reply] [d/l] |
sub check_db_connection {
return 0 if $db->ping;
for my $try (1 .. 3) {
sleep 15;
Log(*LOGFILE, "WARNING:: $0::db appears to have gone away, att
+empting to reconnect (try $try)");
return 0 if $db = connectdb('mydatabase');
}
Log(*LOGFILE, "ERROR: $0:Cannot reconnect to mydatabase, exiting."
+);
close(*LOGFILE);
exit 0;
}
Then what I did was call check_db_connection before each database transaction.
Is this the best way to do it? (I doubt it)
Are there potential traps with the above? (Probably)
But.... it worked fine for me for several months :)
Cheers,
Darren :) | [reply] [d/l] [select] |