(-> % read write unlearn)

My writings on this area are my own delusion

Java の connection pool ライブラリ HikariCP

RDBをサービスで使うんだとしたら、普通は必ず必要になるであろう「アプリケーションでのコネクションのプーリング」の話です。

Javaでコネクションプールのライブラリと言うと、commons dbcpぐらいしか自分は知りません。seasarだと独自のコネクションプール実装のS2DBCPがあったようです。ずっと使ってたけどよく分かってませんでした。

で、Clojureでコネクションプーリングするとしたら、何がメジャーなのかというのが気になって調べ始めました。調べてみたら別にClojure関係なくJavaのコネクションプールのライブラリを調べる結果となりました。

あんまり種類見つからなかったので、出逢ったものを全部列挙します。

C3P0 and commons DBCP

C3P0 と commons DBCP はどちらも結構古い*1です。 どっちがいいのか分からないですが、この2009年のstackoverflowの記事によると、「commons DBCP は out of date だから C3P0 を使え」・・・「と思ったけど、そんなこと無かった」とかベストアンサーの人が言ってます。

と思いきやよく見ると、コメント欄に「 HikariCP っていうのがめっちゃオススメ」って言ってる人がいます。2013年10月のコメントです。

BoneCP

(HikariCPはいったん置いておいて)commons DBCPでググると1stページにDBCP より 50倍早い!? BoneCP を使って高速コネクション・プーリングを実現する方法という記事がひっかかりました。 50倍高速ならこれを使っとけばOKだと思うんですが、ベンチマークのページの画像がいくつかリンク切れしててちょっと不安になります。

と思いきや、「Tomcatの新しいJDBC poolを加えた、新しいベンチマークこちら.」というリンクがあって、それを押すと、今度は Internal Server Error だったのでさらに不安になりました。

githubのBoneCPに行くと、一番上に「・・・C3P0 や DBCP のような古いやつを打ち負かす。だけど、今はdeprecatedで、HikariCPのほうが好ましい」って書いてありました。。

Tomcat JDBC Connection Pool

BoneCPのおかげでTomcatにもコネクションプールの実装があることを知りました(遅い・・・)。tomcat7.0以降はデフォルトで付いてくるそうです。ただ、今回はTomcat縛りではないほうが嬉しいので、選択肢としてはなしです。

HikariCP

githubのHikariCPを見ると、めっちゃ速いってベンチマークが載ってるし、漢字で「」って書いてるだけあって速さを意識してるんだと思います。スターも1000以上付いています。

vibur

HikariCPのベンチマークのグラフを見ると、2番目に速いライブラリにviburというのが出てきます。vibur-dbcpはvibur-object-poolという、より汎用的なプーリングの仕組みのライブラリをベースにしているようです。githubのvibur-dbcpを見ると、開発は今もされているようですが、コントリビュータは1人でスターも12個と、HikariCPと比べるとマイナーのようです。

conclusion

結論として、HikariCPが最も速そうで、今最もメジャーそうです。play2.4もhikaricp使ってるっぽいし。ただし、ここまで*2一切自分でベンチマーク取ったり、ソース読んだり、動かしていません。

で、もともとの目的のClojureでのコネクションプーリングですが、HikariCPのClojureラッパーの実装があるようなので、とりあえずそれで良いんじゃないでしょうか。*3

*1:自分がプログラミングをちゃんと(?)始めた2009年以前に作られたライブラリは、自分にとっては全部とりあえず「古い」カテゴリです。

*2:これ以降も

*3:本当はClojureでコネクションプールを使うっていう記事を書こうとしたんだけど、前置きが長くなってしまったので、いったんここまでで記事を区切りました。