0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

psqlがない場合のpostgres接続確認ツール例

0
Posted at

あるサーバにpostgresが用意されたらしいから、接続確認してみたいけど、
今ここにはpsqlがないなあ、、
作成中のwebアプリはまだ動作する状況じゃないし、、
取り敢えずIP、port、ユーザ、DBとか想定とおり繋がるかだけ見たいんだけど、、
ping, nc, telnetとかではレイヤ的に届かないし、、

作るか。

ソース

1. 目的

PostgreSQLに対してJDBC接続を行い、簡単なSQLを実行することで、
psqlがない環境でもPostgreSQLへの接続確認を行える簡素なツールを、
Javaで用意してみました。

想定用途は、構築時や問題切り分け時に、
postgresに対しての手元Windows環境、NWセグメントから簡単なsql実行確認や、
APサーバからDBサーバへのpostgres疎通確認です。
psqlを導入していない、できないノードから、IP、port、hbaといった要素の動作確認を目的とします。

使い方はreadmeご確認ください。(jdbc取得、コンパイル、起動スクリプト実行、といった感じです)
以下では実装を概説します。


2. ソース全体の構成

PgJdbcCheck.javaは、1ファイル内に以下のクラスを持つ構成です。

PgJdbcCheck.java
└── public class PgJdbcCheck
    └── private static class Config

構成方針

このツールでは、あえて複数クラス・複数ファイルに分割せず、1つのJavaファイルに主要処理を集約しています。

理由は以下です。

  • 配布・説明を簡単にするため
  • 小規模な疎通確認ツールであるため
  • jar化・bat/sh起動をシンプルにするため
  • Java学習・動作確認用として見通しを良くするため

3. PgJdbcCheckクラス

3.1 役割

PgJdbcCheckは、このツール本体のメインクラスです。

以下の責務をまとめて持っています。

  • アプリケーション起動
  • 設定ファイルの探索
  • 設定ファイルモード / 対話モードの切り替え
  • PostgreSQL JDBC接続
  • 確認SQLの実行
  • 結果の画面出力
  • 必要に応じたログ出力
  • 異常時の簡易エラー表示

3.2 なぜ1クラスに集約しているか

通常の業務アプリであれば、以下のように責務分割する余地があります。

ConfigLoader
ConsoleInput
JdbcChecker
Logger
Main

しかし、今回のツールは「簡素な接続確認ツール」であり、過度なクラス分割をすると、逆に配布・理解・保守が重くなります。

そのため、現在の構成では PgJdbcCheckクラスに処理を集約しています。

これは、今回のツールの目的に対して妥当な割り切りです。


4. PgJdbcCheckクラス内の主な処理領域

PgJdbcCheckクラスの中では、処理の種類ごとにメソッドが分かれています。

大まかには以下の領域があります。

起動処理
設定ファイル関連
対話入力関連
JDBC接続・SQL実行関連
ログ出力関連
ユーティリティ処理

5. 起動処理

対象

public static void main(String[] args)

役割

mainメソッドは、ツール全体の処理順序を制御します。

大まかな流れは以下です。

1. 開始メッセージを表示
2. jar配置ディレクトリを取得
3. 設定ファイルを探す
4. 設定ファイルモードか対話モードかを判定
5. ログ出力設定を確認
6. 必要であればログファイルを作成
7. PostgreSQLへの接続確認を実行
8. 終了前に Enter 待ち

6. 設定ファイル関連処理

対象メソッド

resolveConfigFile(...)
loadProperties(...)
loadConfigMode(...)

役割

設定ファイル関連処理では、以下を行います。

  • 設定ファイルの場所を決める
  • PgJdbcCheck.confを読み込む
  • 読み込んだ設定値をConfigオブジェクトへ格納する

設定ファイルの扱い

jarと同じ階層にある以下のファイルを探します。

PgJdbcCheck.conf

設定ファイル内で、以下が指定されている場合は設定ファイル利用モードになります。

USE_CONFIG=useConfig

それ以外の場合、または設定ファイルが存在しない場合は、対話モードで動作します。

この設計の意図

起動スクリプトのbatshに複雑な引数を持たせず、ラッパーとして単純にjava -jarするだけにしています。

モード判定はJava側に集約しているため、利用者は以下のどちらでも使えます。

設定ファイルを置いて自動実行
設定ファイルを置かずに対話入力

7. 対話入力関連処理

対象メソッド

interactiveMode()

役割

interactiveModeは、利用者にコンソールから接続情報を入力してもらう処理です。

入力する主な項目は以下です。

  • DBホスト / IP
  • ポート番号
  • データベース名
  • ユーザ名
  • パスワード
  • 接続タイムアウト秒数
  • ソケットタイムアウト秒数
  • ログ出力有無

デフォルト値

各入力にはデフォルト値があります。

そのため、ローカルのPostgreSQLを簡単に確認したい場合は、Enterを連打して動かせるようになっています。

パスワード入力

System.console()が利用できる環境では、パスワードを非表示入力します。

ただし、IDEや一部実行環境では System.console()nullになる場合があります。
その場合は通常のテキスト入力になります。


8. JDBC接続・SQL実行処理

対象メソッド

executeCheck(...)

役割

executeCheckは、このツールの中心処理です。

以下を行います。

1. 設定値の必須チェック
2. JDBC URL の作成
3. PostgreSQL JDBC Driver のロード
4. DriverManager による接続
5. Statement の作成
6. 確認用SQLの実行
7. 結果の表示

実行している確認SQL

確認用SQLでは、以下の情報を取得しています。

select
  version() as version,
  current_database() as database_name,
  current_user as user_name,
  inet_server_addr() as server_addr,
  inet_server_port() as server_port,
  now() as server_time

このSQLで確認できること

このSQLが成功することで、以下を確認できます。

  • PostgreSQL JDBC Driver でDBサーバへ接続できている
  • PostgreSQLとして応答している
  • pg_hba.conf 等で接続が許可されている
  • ユーザ・パスワードが正しい
  • 指定DBに接続できている
  • SQLを実行できている

9. ログ出力関連処理

対象メソッド

showLogMode(...)
initLogIfNeeded(...)
log(...)
closeLog()

役割

ログ出力関連処理では、画面出力と同じ内容をログファイルへ出力します。

設定ファイル、または対話入力で以下が指定された場合にログを出力します。

WRITE_LOG=YES

ログファイル名

ログファイルは、jarと同じ階層に以下の形式で作成されます。

PgJdbcCheck_yyyyMMdd_HHmmss.log

ログ出力の考え方

このツールでは、画面表示とログ表示をなるべく一致させるため、出力処理をlog()メソッドに集約しています。

log()に渡した内容
↓
画面へ表示
↓
ログ有効時はログファイルにも出力

注意点

対話入力中のプロンプト表示はSystem.out.print()を使っているため、すべてが完全にログへ残るわけではありません。

ただし、接続対象、成功結果、エラー情報など、確認結果として重要な情報はログに残ります。


10. ユーティリティ処理

対象メソッド

validateConfig(...)
isEmpty(...)
getApplicationDirectory()
waitEnter()

役割

補助的な処理を担当します。

validateConfig

DB接続に必須となる以下の値が空でないか確認します。

  • host
  • port
  • dbName
  • user

isEmpty

文字列がnullまたは空文字かを判定します。

getApplicationDirectory

jarファイル、またはclassファイルが配置されているディレクトリを取得します。

この処理により、以下のような設計が可能になっています。

jarと同じ階層に設定ファイルを置く
jarと同じ階層にログを出力する

waitEnter

処理終了前にEnter入力を待ちます。

これはWindowsの.batダブルクリック起動時に、画面がすぐ閉じて結果が読めなくなることを防ぐためです。
pauseと重複しますが、念の為です。


11. Config内部クラス

対象

private static class Config

役割

Configクラスは、接続確認に必要な設定値を保持するための内部クラスです。

保持している主な値は以下です。

host
port
dbName
user
password
connectTimeoutSec
socketTimeoutSec
writeLog

なぜ内部クラスなのか

Configは、このツール内部でのみ使うデータ入れ物です。

外部から利用される想定はないため、private static classとしてPgJdbcCheckの中に閉じ込めています。

役割としてはDTOに近い

Configは処理を持たず、値を保持するだけです。

そのため、役割としては以下に近いです。

DTO
設定値コンテナ
データ入れ物

12. 全体の処理フロー

大まかな処理フローは以下です。

PgJdbcCheck起動
  ↓
jar配置ディレクトリ取得
  ↓
PgJdbcCheck.confを探す
  ↓
USE_CONFIG=useConfig ?
  ├─ yes → 設定ファイルモード
  └─ no  → 対話モード
  ↓
Configオブジェクト作成
  ↓
WRITE_LOG=YES ?
  ├─ yes → ログファイル作成
  └─ no  → 画面出力のみ
  ↓
JDBC URL作成
  ↓
PostgreSQL JDBC Driverロード
  ↓
DB接続
  ↓
確認SQL実行
  ↓
結果表示
  ↓
Enter待ち
  ↓
終了

13. このソースの割り切り

このソースは、あくまで簡素な疎通確認ツールとして作成されています。

そのため、以下は最小限の実装または実装なしです。

  • エラーハンドリング:最小限
  • 入力値検証    :なし
  • ログ管理     :なし
  • セキュリティ対策 :なし
  • SSL接続設定    :なし
  • 任意SQL実行機能  :なし
  • 詳細な診断機能  :なし

意図的にpsqlの代替ツールにはしていません。

目的は、以下に限定しています。

構築時や問題切り分け時にPostgreSQL JDBC Driverを使ってDBへ接続できるか確認する
固定の確認SQLを1回実行して結果を表示する

14. ポイント

1つのメインクラスと1つの内部設定クラスで構成された、シンプルなPostgreSQL JDBC疎通確認ツールです。

設計上の特徴は以下です。

  • Javaソース1ファイルに集約
  • jar、conf、bat、shを同一階層に置く前提
  • 設定ファイルが使える場合は非対話
  • 設定ファイルがない場合や無効な場合は対話
  • 画面出力とログ出力をなるべく共通化
  • JDBC接続確認に目的を限定

小規模な確認ツールとして、理解しやすく、配布しやすく、現場でも使いやすい構成にしています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?