自分の中ではDBCP2がコネクションプールの定番だったが、今はHikariCPが鉄板らしい。
そこで、Jettyで使うPostgresq接続のプールをHikariCPで行うの事にしたのだが、かなりハマったのでメモ。
<New id="hikarids-postgres" class="org.eclipse.jetty.plus.jndi.Resource">
<Arg>
<Ref refid="webアプリケーション" />
</Arg>
<Arg>jdbc/hikarids-postgres</Arg>
<Arg>
<New class="com.zaxxer.hikari.HikariDataSource">
<Arg>
<!-- 省略可能
<New class="com.zaxxer.hikari.HikariConfig">
-->
<Set name="dataSourceClassName">org.postgresql.ds.PGSimpleDataSource</Set>
<Set name="minimumIdle">1</Set>
<Set name="maximumPoolSize">10</Set>
<Set name="connectionInitSql">select version();</Set>
<Call name="addDataSourceProperty">
<Arg>user</Arg>
<Arg>接続ユーザー名</Arg>
</Call>
<Call name="addDataSourceProperty">
<Arg>password</Arg>
<Arg>接続パスワード</Arg>
</Call>
<Call name="addDataSourceProperty">
<Arg>serverName</Arg>
<Arg>接続ホスト名(IPアドレスでも可能)</Arg>
</Call>
<Call name="addDataSourceProperty">
<Arg>portNumber</Arg>
<Arg>接続ポート</Arg>
</Call>
<Call name="addDataSourceProperty">
<Arg>databaseName</Arg>
<Arg>接続DB名</Arg>
</Call>
<!-- 省略可能
</New>
-->
</Arg>
</New>
</Arg>
</New>
ここでややこしいのが、postgresの接続情報を指定するのに、HikariDataSourceのインスタンスへ直接指定するのではなく、インスタンス化する引数で使うHikariConfigのaddDataSourcePropertyメソッドを通じて指定している事だ。直接データを指定するメソッドを準備してくれればよいものを、どうしてこんなにまどろっこしい事をしているのか・・・・。
おそらく、db接続に使うアドレス、ユーザー名、パスワード、ポートの指定方法が、いろいろなドライバークラスで統一が取れていないからなんじゃないかと思う。
jdbc:postgresql://ホスト名:port/database名 のような URL形式で接続できたり、バラバラに指定できたりするのが自由に行われているのが原因じゃないだろうか。
JDBCはこのへんを曖昧のまま放置してきたので、いまだにややこしい事が起きている気がする。
省略可能:
HikariDataSourceのコンストラクタにHikariConfigを渡さない場合でも、HikariConfigを継承しているのでaddDataSourcePropertyをCALLしてやることで、接続情報を指定できる。
0 件のコメント:
コメントを投稿