こういったことをする人はあまりいないと思うんですけど、仕事で必要になったので調べたことをメモ代わりに。
あと、PostgreSQLのJDBCの接続文字列に指定できるoptionsの記事があまり見つからなかったので。
多分、皆さんJavaでPostgreSQLに接続する場合、接続文字列ってこう書くと思います。
jdbc:postgresql://host:port/dbname
これにパラメタを指定できるんですね(最近知りました)
jdbc:postgresql://host:port/dbname?param1=value1¶m2=value2&...
例えば、アプリケーション名を指定する場合以下のように指定します。
jdbc:postgresql://host:port/dbname?ApplicationName=hogehoge
これを指定すると、SELECT * FROM pg_stat_activity;なんかを実行すると、application_nameカラムにhogehogeと表示されます。
複数のシステムから接続するようなDBなんかでは重宝しますね。
(これはやってる人がいっぱいいそう)
で、本題。
接続文字列でwork_memとかも指定可能です。
jdbc:postgresql://host:port/dbname?ApplicationName=hogehoge&options=-c work_mem=1GB
さらに複数指定したい場合はこんな感じで書くことができます。
jdbc:postgresql://host:port/dbname?ApplicationName=hogehoge&options=-c work_mem=1GB -c enable_nestloop=off
ちなみに、今回はJava 1.6で動かさないといけなくて、どこから動くか確認したところ、postgresql-42.2.6.jre6.jarから動くようです。
ただ、なぜかpostgresql-42.2.15.jre6.jarはエラーになりました。なんだったんだろう・・・?
(たまたま古いJDBCドライバを使っているシステムでoptionsを指定したくなってやったらできなかった)
時間があるときに、Java1.6以外も調べたいところ。
複数のシステムから接続するPostgreSQLがある場合、あるシステムではwork_memを多めに、または少なめに設定したい、といった場合に使ったり、あるシステムではクエリプランを制御するために特定の設定を変える、というようなシーンで利用できると思います。
参考