1998年04月16日

Linux とPostgreSQL でJDBC


PostgreSQL やフリーDBMS について

PostgreSQL はいろいろなプラットフォームがサポートされたフリーなRDBMS です。
Linux はメインのプラットフォームらしく、簡単に導入できます。

PostgreSQL については、 PostgreSQL mailing list in Japan (http://www.sra.co.jp/people/t-ishii/PostgreSQL/)に情報がたくさんあります。
PostgreSQL の入手方法もこのページで紹介されています。

Linux にPostgreSQL をインストールするには PostgreSQL Notes for Japanese (http://www.rccm.co.jp/~juk/pgsql/)のページがとても丁寧です。


私はJava のJDBC を勉強する必要があり、Linux で動くJDBC ドライバがあるフリー RDBMS を探していてPostgreSQL にたどりつきました。
フリーDBMSメーリングリストのページ(http://neal.nikkeibp.co.jp/FreeDBMS/) にはその他にもたくさんのフリーDBMS が紹介されています。

Linux にPostgreSQL 6.3.1をインストール

上記の PostgreSQL Notes for Japanese (http://www.rccm.co.jp/~juk/pgsql/)のページではLinux 用のバイナリーパッケージ も公開されているようです。
最新バージョンを入れたかったことと、自分でmake してみたかったこともあり、 自力で挑戦してみました。

困ったのは、libreadline というライブラリが必要なのに入手方法がわからない ことでした。このライブラリがなくてもコンパイルする方法も紹介されていますが、 ツールとかでキーボードの矢印キーとかが使えなくなりそうで、 libreadline はぜひいれたいと。

結局インターネットのいろんなところにころがっているFreeBSD 用のlibreadline のソースディレクトリを丸ごともってきてLinux 用にmake してみることにしました。
これが楽勝で、FreeBSD 用のlibreadline のソースにINSTALL 方法のドキュメント ファイルもあるし、configure スクリプトでLinux 用のMakefile も生成できました。
libreadline のインストール
cd libreadline
chmod 755 configure
chmod 755 support/*
./configure
make
su
make install
最後のmake install でエラーが出ましたが、/usr/local/lib/libreadline.a とか /usr/local/include/readline の下のヘッダファイルとか必要なファイルはちゃんと できたので追求しないことにしました。

参考までに、私の場合のPostgreSQL をSlackware-3.4 Linux(kernel 2.0.33) へ入れる 手順は次のような感じでした。

ヘンなエラーが出て先に進めないといったことはありませんでしたが、手順は やや多いようです。
/usr2/local/freesoft/postgresql-6.3.1 というディレクトリは適当に読み替えて 下さい。
postgres アカウント作成
postgres のホームディレクトリを作成
postgres でログイン
/usr2/local/freesoft/postgresql-6.3.1/src/Makefile.custom を
新規作成し、MB=EUC_JP を記述
cd /usr2/local/freesoft/postgresql-6.3.1/src
configure --prefix=/usr2/local/pgsql
  インクルードファイルパスの質問で、/usr/local/include/readline
  を指定
  ライブラリパスの指定で/usr/local/lib を指定
make all
make install
環境変数
  setenv LD_LIBRARY_PATH /usr2/local/pgsql/lib
  setenv PGLIB /usr2/local/pgsql/lib
  setenv PGDATA /usr2/local/pgsql/data
を.cshrc に設定
source ~/.cshrc で環境変数を読み込み
PostgreSQL のinitdb を実行
data/pg_hba.conf を編集してセキュリティーを設定。私はデフォルトのままでOK
別ウィンドのpostgres アカウントから postmaster を実行
cd /usr2/local/freesoft/postgresql-6.3.1/src/test/regress
make clean
make all runtest
 ==> numerology, geometry が失敗しました。う〜ん
destroydb regression
make clean
postmaster を停止(Ctrl-C)

postgresql-6.3.1/contrib/linux/postgres.init を修正
    PGOPTS="-B 256" を PGOPTS="-i -B 256" に書き換え
    . /etc/rc.d/init.d/functions をコメントアウト
    . /etc/sysconfig/network をコメントアウト

    if [ ${NETWORKING} = "no" ]
    then
       exit 0
    fi
    をまとめてコメントアウト

/etc/rc.d/rc.local に次を追記
----------------------------------------------
#PostgreSQL
if [ -f /usr2/local/freesoft/postgresql-6.3.1/contrib/linux/postgres.init ]; then
   /usr2/local/freesoft/postgresql-6.3.1/contrib/linux/postgres.init start
fi
----------------------------------------------
Linux をリブート

rc.local でDB エンジンを起動するのなら、シャットダウンの時にDB エンジンを 終了させるための手続きを記述する必要があると思います。しかしドキュメントには それに関する話が見当たりません。
postmaster はSIGTERM シグナルで終了してくれるようなので、OS のシャットダウンの 時のSIGTERM で正常に終了しているんでしょうね。(きっとそうだウン)

JDBC ドライバーのセットアップ

PostgreSQL にはJava で記述されたクライアントからアクセスするためのJDBC API 準拠のドライバーが付属します。
次のようにしてセットアップします。
(JDK がインストールされている必要があります)
cd /usr2/local/freesoft/postgresql-6.3.1/src/interfaces/jdbc
make
make examples
環境変数CLASSPATH に、できたpostgresql.jar をフルパスで指定
ところがこのJDBC ドライバーでは日本語等のコードが実行時のプラットフォームの エンコードに依存するようになっています。
PostgreSQL はありがたいことに日本語EUC に対応しているのですが、Java プログラム がSJIS 環境で実行されるとSJIS コードがDB バックエンドに届いてしまいます。

そこでプラットフォームによらず必ず日本語EUC コードが送られるようにJDBC ドライバ に簡単な修正を行いました。
postgresql.jdbc_euc_patch980415としてパッチを公開します。
あらゆる機能を試したわけではないので修正もれなどあるかもしれません。 注意してください。

パッチのあて方は
cd /usr2/local/freesoft/postgresql-6.3.1/src/interfaces/jdbc
patch < postgresql.jdbc_euc_patch980415
make
のようにして下さい。

DBMS を使う

仕事などで簡単なSQL 文を書くことはあったのですが、DBMS の管理や運用は やったことがありません。
PostgreSQL のインストールができても最初はわからないことの連続でした。

PostgreSQL をインストールして、createdb コマンドでDB を作成し、psql コマンドで 表を作成したり挿入、検索が行えます。
でもpostgres ユーザー以外のユーザーがDB を使うための設定が最初わかりませんで した。
これはpostgres ユーザーの権限からcreateuser コマンドでユーザー登録を行う と登録されたユーザーもpsql コマンドを使えるようになりました。

すると、postgres ユーザーの作成した表に他のユーザーがアクセスできないという 問題にぶつかりました。
これはSQL のgrant 文で権限を設定できることがわかりました。

それでいよいよJDBC を使ってみたのですが、最初は全然動きませんでした。
インストールのところでpostmaster の起動オプションで-i(TCP/IP ソケットによる 接続)を最初はつけていなかったからです。
これには結構はまってしまいました。

JDBC は使えるようにりました。JAVA のサンプルプログラムが入っていてAPI の 雰囲気も容易につかめました。src/interface/jdbc/examples/basic.java を見れば すぐ飲み込めると思います。

ネットワークをまたいでクライアントからJava でサーバーのPostgreSQL に接続する 場合にJDBC のURL をどのように記述すればいいのかがわからず困りましたが、 JDK のドキュメントで
jdbc:postgresql://hostname.dokodoko.co.jp/dbname
のように、最後の項目をサーバーのアドレス込みで書けばいいとわかりました。
これだけでローカルで動いていたプログラムが急にネットワークをまたげるようになり 驚きです。

ところが、どうも日本語がうまく扱えないことに気付きました。 これにもかなりはまりましたが、JDBC ドライバに原因がしぼれ、なんとか 改造することができました(上記のパッチですね)。

データベースについてとても参考になったのは UNIX データベース入門 (http://www.wakhok.ac.jp/DB/DB.html)のページでした。
たくさん勉強させていただきました。とても感謝しています。


わたし流のLinux メニューへ戻る
メインメニュー へ戻る