PostgreSQL の恐ろしい DataSource 実装について
qiita.com
17日目です。
みなさん、PostgreSQLのDataSourceの実装には2種類あるの知っていましたか?
(普段からPostgreSQLを使っている人なら知っていると思いますが)私は知りませんでした。。。
そこで、この恐怖のDataSourceについて書いておこうと思います。
1. はじめに
事の始まりはとある新規開発で、
アプリケーションサーバーや、データベースなど
OSSを使う事が前提だったため、PostgreSQLを選んだのが始まりでした。
選んだというか選ばれていたというか・・・
アプリケーションサーバーはちょっと気になっていたGlassFishを使いました。
バグに遭遇したり色々ありましたが新規開発は色々仕組みを考えたりするので楽しいですね。
色んなライブラリを使ったり、最新バージョンをいち早く取り込んだり。
あぁ、こういうの楽しかった。
(今はExcelばかり。。。)
2. PostgreSQL JDBC ドライバーのダウンロード
MySQLじゃない・・・というのは置いとおいて。
使用した環境は以下の通りです。
- Java8u66
- GlassFish 4.1.1 管理コンソール日本語化済み
- PostgreSQL 9.3
何はともあれJDBCドライバーをダウンロードします。
https://jdbc.postgresql.org/download.html
今回はピンクの枠のドライバーをダウンロードしました。
ダウンロードしたドライバーを実際に使うときはどんなクラスを指定したら良いのかはこちらに書かれています。
https://jdbc.postgresql.org/documentation/head/ds-ds.html
ふむふむ、2種類あるらしいっていうことは分かった。
3. いざGlassFishにJDBCを設定
GlassFishの管理コンソールから登録しようとしたらエラーで登録出来なかったので、
JDBC関連の登録は専らリソースファイルを作ってコマンドラインで登録しています。
4.1のときも画面から登録出来ていましたが不安定だったりするのでやっぱりコマンドラインから登録していました。
こんなファイルを用意して
gist.github.com
コマンド一発です。
これでOKなんです。本当は。
これで終わっていれば良かったんですが。
GlassFishの管理コンソールではこんな感じで表示されます。
おや?
左のメニューにJDBC接続プールって書かれてるな。
ということは、さっきのクラスもこっちなんじゃ・・・
おっしゃー!これやー。
というノリでこんな設定でやっていました。
この設定に変えたのは開発も中盤に差し掛かってからでした。
その頃からなぜかDBにアクセス出来ない現象がたまに発生していました。
原因不明なので接続数を増やしたりポスグレを再起動したりして凌いでいました。
一番アカンやつです。
良い子は真似しちゃいけません。
実はとある方から助言を頂きまして・・・
Pooling実装
クソやから使わんといてってポスグレのドキュメントに書いてあるよ。
AP Server の Pooling か Commons DBCP 使ってねって。
GF Pooling するデータソースにポスグレの PoolingDS 渡したら2重になるやん・・・
あ、マジで?
マジかよ!
GlassFishでプーリング出来るので、ここは難しく考えずに(何にも考えてなかったけど)
org.postgresql.ds.PGSimpleDataSource を使えば良かったという話です。
英語もちゃんと読むようにしよう。。。