接続状態の確認に connected? を優先使用

rails/rails

Rails 8.1では、データベース接続の有効性チェックにおいて、より正確な状態判定を行うようになりました。

背景

これまで with_raw_connection メソッドでは、接続が nil かどうかのみをチェックしていましたが、これでは接続が確立されているものの使用不可能な状態(例:ネットワーク切断後など)を検出できませんでした。#56657 では、connected? メソッドを使用することで、より包括的な接続状態の判定を実現しています。

技術的な変更

AbstractAdapterの修正

変更前:

def with_raw_connection(allow_retry: false, materialize_transactions: true)
  @lock.synchronize do
    connect! if @raw_connection.nil? && reconnect_can_restore_state?
    # ...
  end
end

変更後:

def with_raw_connection(allow_retry: false, materialize_transactions: true)
  @lock.synchronize do
    connect! if !connected? && reconnect_can_restore_state?
    # ...
  end
end

PostgreSQLアダプターの強化

PostgreSQLアダプターでは、connected? メソッドがより詳細な状態チェックを行うようになりました:

def connected?
  !(@raw_connection.nil? || @raw_connection.finished? || @raw_connection.status != PG::CONNECTION_OK)
end

これにより、以下の3つの条件すべてをクリアしている場合のみ「接続中」と判定されます:

  1. @raw_connection が存在する
  2. 接続が終了していない(finished? が false)
  3. PostgreSQLの接続ステータスが PG::CONNECTION_OK

active?メソッドの改善

active? メソッドも connected? を使用するように変更されました:

def active?
  @lock.synchronize do
    return false unless connected?
    @raw_connection.query ";"
    verified!
  end
end

これにより、active? の呼び出し時に接続状態を即座に判定し、不正な接続として記録できるようになります。

設計判断

この変更の重要なポイントは、接続が使用不可能になったことを検出したら、その状態を記憶するという点です。PR説明にあるように、「新たな切断をリアルタイムで検出するわけではない」ものの、一度問題が検出された接続については、以降の処理で不要な再試行を避けることができます。

テストの分割が必要になった理由は、active? の呼び出しが接続を「不正」としてマークするようになったためです。以前のテストでは、active? チェック後に自動的に接続が回復してしまい、意図したテストケースを実行できなくなっていました。

新しいテストケースでは、以下の動作を確認しています:

test "active? on a 'clean' recently-used but now-failed connection detects but doesn't fix the problem" do
  remote_disconnect @connection
  @connection.clean! # プールからの新規チェックアウトをシミュレート

  # cleanメソッドは接続を検証・修正しない
  assert_not_predicate @connection, :active?

  # active?チェックも接続を修正しない
  assert_not_predicate @connection, :active?
end

これにより、接続プールから取り出された接続が実際には使用不可能だった場合、それを検出できるが自動修復はしない、という挙動が保証されます。過度な再検証を避けつつ、明示的なエラー処理を促す設計となっています。

記事メタデータ

Generated by:
Claude Sonnet 4.5 for DiffDaily

この記事はAIによって自動生成されています。内容の正確性については、必ずソースコードやPRを確認してください。

品質レビュー結果

Review Status:
承認済み
Review Count:
1回
Reviewed by:
Gemini 2.5 Pro for DiffDaily

Review Criteria:

ガイドライン準拠 ✓ PASS

記事構成とDiffDaily Styleへの準拠状況

記事構成(Title, Context, Technical Detail, Design Insight)、カスタムMarkdown構文、対象読者への適合性、すべての項目でガイドラインを遵守しています。特に、任意項目であるDesign Insightが的確に盛り込まれており、変更の背景を深く理解できる内容になっています。

  • 記事構成(Title、Context、Technical Detail)
  • DiffDaily Styleガイド準拠
  • カスタムMarkdown活用
  • 対象読者への適合性
技術的整合性 ⚠ WARNING

技術的な正確性と表現の適切性

Diff情報が提供されていないため、記事内のコード例と実際の変更内容との完全な照合はできませんでした。しかし、引用されているコードスニペットは構文的に正しく、記事の説明と技術的に整合性が取れています。技術用語の選択も正確です。

  • 技術用語の正確性
  • コード例の正確性
  • 説明の技術的正確性
PR内容との整合性 ✓ PASS

元のPR情報との一致度

PRのタイトル、説明、コード変更の内容と記事の主張が完全に一致しています。特に「テストを分割した理由」など、PRの重要なコンテキストを正確に捉えており、ハルシネーションは見られません。PR番号も正確です。

  • タイトル・説明の一致
  • Diff内容の正確な反映
  • 推測の排除