いつブロ

いつまで続くか分からないブログ(仮)主に趣味やプログラミングに関するメモを書いています。

PostgreSQL の恐ろしい DataSource 実装について

qiita.com
17日目です。
 
みなさん、PostgreSQLのDataSourceの実装には2種類あるの知っていましたか?
(普段からPostgreSQLを使っている人なら知っていると思いますが)私は知りませんでした。。。
そこで、この恐怖のDataSourceについて書いておこうと思います。
 

1. はじめに

事の始まりはとある新規開発で、
アプリケーションサーバーや、データベースなど OSSを使う事が前提だったため、PostgreSQLを選んだのが始まりでした。
選んだというか選ばれていたというか・・・
 
アプリケーションサーバーはちょっと気になっていたGlassFishを使いました。
バグに遭遇したり色々ありましたが新規開発は色々仕組みを考えたりするので楽しいですね。
 
色んなライブラリを使ったり、最新バージョンをいち早く取り込んだり。
あぁ、こういうの楽しかった。
(今はExcelばかり。。。)
 

2. PostgreSQL JDBC ドライバーのダウンロード

MySQLじゃない・・・というのは置いとおいて。
使用した環境は以下の通りです。

 
何はともあれJDBCドライバーをダウンロードします。
https://jdbc.postgresql.org/download.html
 
f:id:koichi0814:20151215021155p:plain
 
今回はピンクの枠のドライバーをダウンロードしました。
 
ダウンロードしたドライバーを実際に使うときはどんなクラスを指定したら良いのかはこちらに書かれています。
https://jdbc.postgresql.org/documentation/head/ds-ds.html
 
f:id:koichi0814:20151215022431p:plain
 
ふむふむ、2種類あるらしいっていうことは分かった。
 

3. いざGlassFishJDBCを設定

GlassFishの管理コンソールから登録しようとしたらエラーで登録出来なかったので、
JDBC関連の登録は専らリソースファイルを作ってコマンドラインで登録しています。
4.1のときも画面から登録出来ていましたが不安定だったりするのでやっぱりコマンドラインから登録していました。
 
こんなファイルを用意して gist.github.com
 
コマンド一発です。
f:id:koichi0814:20151215020401p:plain
 
これでOKなんです。本当は。
これで終わっていれば良かったんですが。
 
GlassFishの管理コンソールではこんな感じで表示されます。
f:id:koichi0814:20151215015026p:plain
 
 
おや?
左のメニューにJDBC接続プールって書かれてるな。
f:id:koichi0814:20151215023654p:plain 
 
ということは、さっきのクラスもこっちなんじゃ・・・
f:id:koichi0814:20151215024042p:plain
 
おっしゃー!これやー。
f:id:koichi0814:20151215024400p:plain
 
というノリでこんな設定でやっていました。
この設定に変えたのは開発も中盤に差し掛かってからでした。
その頃からなぜかDBにアクセス出来ない現象がたまに発生していました。
原因不明なので接続数を増やしたりポスグレを再起動したりして凌いでいました。
一番アカンやつです。
良い子は真似しちゃいけません。
 
実はとある方から助言を頂きまして・・・

Pooling実装クソやから使わんといてってポスグレのドキュメントに書いてあるよ。
AP Server の Pooling か Commons DBCP 使ってねって。
GF Pooling するデータソースにポスグレの PoolingDS 渡したら2重になるやん・・・

あ、マジで?
f:id:koichi0814:20151215031222p:plain
 
マジかよ!
 
GlassFishでプーリング出来るので、ここは難しく考えずに(何にも考えてなかったけど)
org.postgresql.ds.PGSimpleDataSource を使えば良かったという話です。
 
英語もちゃんと読むようにしよう。。。