ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

GlassFish3.1.2.2でPostgreSQLのデータソースを設定する方法

以前にGlassFish3でアプリをデプロイした後、JDBCドライバーが見つからないときの対処 - Webサービスで起業を目指すプログラマーblogという記事を書きました。


アプリを再デプロイするとJDBCドライバーが見つからなくなる現象が発生し、アプリにドライバーを含めることで解決すると書きました。


この状態で運用していたのですが、アプリを再デプロイするたびにドライバーがないとエラーになり、GlassFishの再起動をしないといけなくなりました。結局解決していなかったようです。


毎回こんな作業したくないので、今回徹底的に調べました。
結果的に、GlassFishでのPostgreSQLのデータソースの設定が誤っていたのが原因でした。

環境

OS CentOS 6.4 x64
DB PostgreSQL 9.3
GlassFish 3.1.2.2

手順

1.PostgreSQLJDBCドライバーを公式サイトより取得します
http://jdbc.postgresql.org/download/postgresql-9.3-1100.jdbc4.jar

# wgetが使える場合直接ダウンロード
wget http://jdbc.postgresql.org/download/postgresql-9.3-1100.jdbc4.jar

各環境に応じたドライバーは以下を参照してください
http://jdbc.postgresql.org/download.html


2.PostgreSQLJDBCドライバーをGlassFishのlibディレクトリに配置します

/usr/local/glassfish3/glassfish/domains/domain1/lib/ext
※ GlassFishのインストルディレクトリは環境に合わせて変更して下さい


3.GlassFishのコンソールを開きます。

http://localhost:4848
※ ホスト名は環境に合わせて変更して下さい


4.左のメニューより「リソース」→「JDBC」→「JDBC接続プール」を選択し、右側にある「新規」ボタンをクリックして接続プールを新規で作成します
f:id:shinsuke789:20140108154414p:plain


5.ステップ1で以下のように入力し「次」をクリックします
f:id:shinsuke789:20140108154427p:plain

プール名 好きな名前
リソースタイプ javax.sql.DataSource
データベース・ドライバーのベンダー Postgresql


6.ステップ2で以下のように入力します
f:id:shinsuke789:20140108154437p:plain
データソース・クラス名のプルダウン下のテキストボックスに入力する

データソース・クラス名 org.postgresql.ds.PGPoolingDataSource


7.続いて画面下部にある追加プロパティで以下の5項目を残し、それ以外の項目を全て削除します。終わったら「終了」をクリックします
f:id:shinsuke789:20140108154447p:plain

ServerName サーバーのIP等
PortNumber 5432 (default)
DatabaseName データベース名
User ユーザーID
Password パスワード


8.GlassFishを再起動します

# 通常
/usr/local/glassfish3/bin/asadmin restart-domain

# chkconfigに登録されている場合
service glassfish restart

PostgreSQLの接続プールとデータソース

PostgreSQLのデータソースのクラスは以下の2種類があり、プール処理の対応に違いがあります。

プール処理 実装クラス
なし org.postgresql.ds.PGSimpleDataSource
あり org.postgresql.ds.PGPoolingDataSource

GlassFishでウィザードに従ってデータソースを作成すると「PGSimpleDataSource」が選択されます。
設定が初めてだと全くわかりません。


今回の現象は、「PGSimpleDataSource」クラスを使用してDBに接続していたので、
アプリの再デプロイ等が発生すると、コネクションプールの扱いがおかしくなっていたように思います。
そもそもプールには対応していないクラスですから、エラーが発生してもおかしくないですね。