From 6acb69b789e7dd220e16d66b177029997dc5771b Mon Sep 17 00:00:00 2001 From: Mike Rylander Date: Mon, 1 Feb 2016 10:29:28 -0500 Subject: [PATCH] use DBI::connect_cached to automatically reconnect if a db handle fails Signed-off-by: Mike Rylander --- .../lib/OpenILS/Application/Storage/Driver/Pg.pm | 37 ++++++++++------------ 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg.pm index 3a645953a4..c574e55509 100644 --- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg.pm +++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg.pm @@ -34,7 +34,7 @@ my $_db_params; sub db_Handles { - return ($master_db, @slave_dbs); + return map { DBI->connect_cached($_) } ($master_db, @slave_dbs); } sub child_init { @@ -67,7 +67,7 @@ $log->debug("Attempting to connect to $$master{db} at $$master{host}", INFO); try { - $master_db = DBI->connect( + $master_db = [ "dbi:Pg:". "host=$$master{host};". "port=$$master{port};". @@ -75,18 +75,12 @@ ($$master{application_name} ? ";application_name='$$master{application_name}'": ""), $$master{user}, $$master{pw}, - \%attrs) - || do { sleep(1); - DBI->connect( - "dbi:Pg:". - "host=$$master{host};". - "port=$$master{port};". - "dbname=$$master{db}". - ($$master{application_name} ? ";application_name='$$master{application_name}'": ""), - $$master{user}, - $$master{pw}, - \%attrs) } - || throw OpenSRF::EX::ERROR + \%attrs + ]; + + DBI->connect_cached( @$master_db ) || do { + sleep(1); DBI->connect_cached( @$master_db ); + } || throw OpenSRF::EX::ERROR ("Couldn't connect to $$master{db}". " on $$master{host}::$$master{port}". " as $$master{user}!!"); @@ -98,12 +92,13 @@ $log->debug("Connected to MASTER db $$master{db} at $$master{host}", INFO); - $master_db->do("SET NAMES '$$master{client_encoding}';") if ($$master{client_encoding}); + DBI->connect_cached( @$master_db )->do("SET NAMES '$$master{client_encoding}';") if ($$master{client_encoding}); for my $db (@$_db_params) { try { - push @slave_dbs, DBI->connect("dbi:Pg:host=$$db{host};port=$$db{port};dbname=$$db{db}". ($$db{application_name} ? ";application_name='$$db{application_name}'" : ""),$$db{user},$$db{pw}, \%attrs) - || do { sleep(1); DBI->connect("dbi:Pg:host=$$db{host};port=$$db{port};dbname=$$db{db}". ($$db{application_name} ? ";application_name='$$db{application_name}'" : ""),$$db{user},$$db{pw}, \%attrs) } + push @slave_dbs, ["dbi:Pg:host=$$db{host};port=$$db{port};dbname=$$db{db}",$$db{user},$$db{pw}, \%attrs]; + DBI->connect_cached( @{ $slave_dbs[-1] } ) + || do { sleep(1); DBI->connect_cached( @{ $slave_dbs[-1] } ) } || throw OpenSRF::EX::ERROR ("Couldn't connect to $$db{db}". " on $$db{host}::$$db{port}". @@ -114,7 +109,7 @@ throw $e; }; - $slave_dbs[-1]->do("SET NAMES '$$db{client_encoding}';") if ($$master{client_encoding}); + DBI->connect_cached( @{ $slave_dbs[-1] } )->do("SET NAMES '$$db{client_encoding}';") if ($$master{client_encoding}); $log->debug("Connected to MASTER db '$$master{db} at $$master{host}", INFO); } @@ -124,9 +119,9 @@ sub db_Main { my $self = shift; - return $master_db if ($self->current_xact_session || $OpenILS::Application::Storage::WRITE); - return $master_db unless (@slave_dbs); - return ($master_db, @slave_dbs)[rand(scalar(@slave_dbs))]; + return DBI->connect_cached( @$master_db ) if ($self->current_xact_session || $OpenILS::Application::Storage::WRITE); + return DBI->connect_cached( @$master_db ) unless (@slave_dbs); + return DBI->connect_cached( @{ ($master_db, @slave_dbs)[rand(scalar(@slave_dbs))] } ); } sub quote { -- 2.11.0