use DBI::connect_cached to automatically reconnect if a db handle fails
authorMike Rylander <mrylander@gmail.com>
Mon, 1 Feb 2016 15:29:28 +0000 (10:29 -0500)
committerMike Rylander <mrylander@gmail.com>
Fri, 7 Oct 2016 15:43:16 +0000 (11:43 -0400)
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Storage/Driver/Pg.pm

index 3a64595..c574e55 100644 (file)
@@ -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};".
                     ($$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}!!");
 
         $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}".
                 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);
         }
 
     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 {