diff --git a/lib/gitlab/database/load_balancing/load_balancer.rb b/lib/gitlab/database/load_balancing/load_balancer.rb
index e3f5d0ac4708350f7ecf6e8e70bd47b163ae02c3..73d6a4fbb486bc42f3cef3e41611ff3a1315e44d 100644
--- a/lib/gitlab/database/load_balancing/load_balancer.rb
+++ b/lib/gitlab/database/load_balancing/load_balancer.rb
@@ -169,7 +169,11 @@ module Gitlab
           when ActiveRecord::StatementInvalid, ActionView::Template::Error
             # After connecting to the DB Rails will wrap query errors using this
             # class.
-            connection_error?(error.cause)
+            if (cause = error.cause)
+              connection_error?(cause)
+            else
+              false
+            end
           when *CONNECTION_ERRORS
             true
           else
diff --git a/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb b/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
index c647f5a8f5d21ecfaf08d5227be97a420c7b019d..4de5cb7c3d75b0589ffc5f1c60b89c912150d63f 100644
--- a/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
+++ b/spec/lib/gitlab/database/load_balancing/load_balancer_spec.rb
@@ -283,6 +283,12 @@ RSpec.describe Gitlab::Database::LoadBalancing::LoadBalancer, :request_store do
 
       expect(lb.connection_error?(error)).to eq(false)
     end
+
+    it 'returns false for ActiveRecord errors without a cause' do
+      error = ActiveRecord::RecordNotUnique.new
+
+      expect(lb.connection_error?(error)).to eq(false)
+    end
   end
 
   describe '#serialization_failure?' do