設定画面「Database」に関する解説です。
Subsonic系サーバではデフォルトで組み込みのデータベースが使用されているため、特に設定の必要なくそのまま使用できます。この記事には主に外部データデータベースへ切り替えをするため方法が記載されています。
外部データベースの利点には以下のようなものがあります。
- Airsonic時代にセキュリティ上の理由からブラウザからのクエリ実行という裏機能が除去されました。組み込みのデータベースへアクセスする場合、サーバを停止して接続します。外部DB構成の場合、Jpsonic稼働中に同時アクセス可能です
- HSQLDBはSQL端末が比較的限定されますが、外部DBの場合普段使い慣れたSQLアプリやSQL文法を自由に使えます
- DBに並行接続できると、DB接続を行うアプリを作成したりバッチ処理をしたりといった二次利用が行いやすいです
- データベース固有の機能(バックアップやレプリケ等)を利用可能です。(逆に言えばJpsonicにこれらの機能は不要)
コネクションソース
HOSTはオンメモリで組み込みDBを動作させるため、全ての設定がアプリ内で完結します。URLはJDBC経由で外部のDBに接続しに行くので、赤線で示されるDB接続情報が必要になります。JNDIは主にTomcat等へJpsonicを配備するときに、DB接続情報をTomcat側で管理する場合に使用します。そのため赤線で示されるDB接続情報と、JpsonicがTomcatの設定を読みに行くための名称指定の2か所の設定が必要です。
Tomcatに配備する場合必ずJNDIを使用しなければならないわけではありません。HOSTやURLも使えます。
- HOSTやURLは詳細な設定は内部で自動で行われるためお手軽という利点があります
- JNDIは、ユーザがデータベースに関する設定情報を全て決められるという自由度の高さがあります
なんかふくざつw
お仕事の場合こんなめんどくさい仕組みが必要になる場合があります。大抵、図の登場人物が増えます。
- [URL]の構成で、データベースが複数になったりする。JDBCドライバのオプションでマスターDBとセカンダリDBの接続先を登録して、マスターが死んだらセカンダリを見に行ったりする
- [JNDI]で、ユーザからはひとつのシステムに見えるけれど、実は裏ではHttpサーバとTomcatとアプリとデータベースがそれぞれたくさん動いている場合がある。そういったときには悪魔のような設定が行われているでしょう
ですので、やろうと思えばそういっためんどくさいことができるリッチな仕組みがあるんだけれども、それをAirsonicやJpsonicでは最小構成で利用しようとしている・・・とご理解ください。
URLを使用した外部DB接続設定
v112.0.0以降、Resource Settings Helperという項目が追加されました。以前のように直接入力も可能ですが、データベースの接続情報さえ把握していればドライバにあわせたURLへ変換できるようになっています。
JNDIを使用した外部DB接続設定
以前のように直接入力も可能ですが、URLと同様にResource Settings Helperが利用可能です。
URLと異なり、JNDIの場合はリソース名という項目が一つ増えます。JpsonicがTomcatにリソースの問い合わせをするための識別名称になります。ネーミングは何でも良いです。
使用するドライバをクリックすると、JNDI Resouceというテキストエリアに設定用のXMLが出力されます。Tomcatの場合、この設定をconfディレクトリにあるcontext.xmlにコピーします。
このリソース設定は、SubsonicやAirsonicが連綿と使用し続けてきたHSQLDBや関連ライブラリのデフォルト値を参考に決めています。後のバージョンで並列処理が組み込まれたときに、このページで生成する設定も変更される場合があります。
JDBCドライバについて
- JpsonicにはPostgres/MariaDB/MySQLの最新のJDBCドライバが内蔵されています。そのため設定値さえ正しければすぐに接続が可能です
- 速度はマシンパワーに依存しますが、ほとんどの場合オンメモリで動作するHSQLDBが最速になりやすいかと思います。条件が良ければ外部DBでも近い速度を出すことは可能ですが、CREATE/UPDATE/SELECTとそれぞれに速度の特性があるため、処理によってはHSQLDBより速かったり遅かったりすることがあるかもしれません。御自身の環境で比較するのが速いです。もし特に最速にこだわるのでなければ、あるいは許容できる範囲内であれば、利便性で選んでよいと思います
- PGJDBC-NGは公式のPostgres JDBCドライバの代替品でやや高速な処理を行える可能性があります。現在非公式ですが、コミュニティに寄贈してメンテナンスする計画もあるようです。幸いv112.0.0以降設定画面で公式ドライバと交換することが簡単になっているため、もしよろしければお試しください。そこそこパワーのあるlibc環境上でPGJDBC-NGでUNIXドメインソケット使用、のような構成がとれる場合ワンチャンあります(ドキュメントを見ながらおそらく試すことは可能です)
他のDBが使いたい
大抵の場合そのデータベース用のJDBCドライバが提供されています。それをダウンロードしてきてTomcatのlibに保存し、ドライバ名を書き換えれば接続が可能です。Jpsonic単体起動の場合は、起動オプションでクラスパスを通してください。
内部DBへ直接アクセスする際の情報
おそらくここから先はHSQLDBの使い方講座になってしまいます。HSQLDBの使い方は比較的簡単なので、プログラミング初心者でもネットで情報を探せばお役立ち情報へリーチしやすいのではないかと思います。簡単にスクリプトファイルと代表的なターミナルアプリの使い方について記載します。
スクリプトファイルについて
Jpsonicの稼働中にHSQLDBへ割り込みでアクセスすることはできません。DBに接続する際にはJpsonicを停止し、データディレクトリにあるスクリプトファイルへ対してJDBC接続します。
データディレクトリ/db/jpsonic.script例えばWindowsの場合は、デフォルトでは C:\jpsonic\db\jpsonic.script にスクリプトファイルがあります。
このファイルの正体はSQLそのもので、スキーマからデータ全てを含むいわばダンプデータに相当するものです。標準的なSQLで記述されているため他のDBプロダクトでもこれを読み込める可能性は比較的高いです。Jpsonicに限らず、LinuxでDerbyを使っているようなサービスではDB移行にこのような手順が取られることがあります。
DBによってはPostgresのようにnullの扱いが異なるという場合もあり、タグデータ次第では簡単にいかないかもしれません。(利がないので実用している方はほとんどいないと思いますが、ID3v2.4でnull区切りを使用しているような場合等)Jpsonicでデータベース移行をサポートする予定は特にありません。
Windowsでお手軽接続する方法
DBeaverというSQLクライアントを使用するのがお手軽です。
DB設計へのポリシー
AirsonicのDB定義に対して「追加」はしていますが「削除や変更」は行っていません。必要性が明確であれば設計変更も辞さないのですが、データベースのレイヤーでむやみやたらにちゃぶ台返しをするのは好みません。
- Sonic系サーバは歴史が長いため、直接DB操作する方も多くDB設計は暗黙知になっています。個人的にはスキーマもエコシステムの一部に近いのでは、と考えています。ユーザがDBに直繋ぎして何かに転用、という使い方を尊重します
- たとえば他のSonic系サーバで使用していたバッチや、API経由でなくDBに直繋ぎするタイプのプログラムをJpsonicで使用する場合そのまま使えることが望ましいです。ユーザが作ったSQLがある日いきなり動かなくなることは避けるべきでしょう
- 設計変更により性能改良も可能ですが、ボトルネックはそこではない場合がほとんどです。得られるわずかな速度より失われる設計互換性に注視します
一般的なWebアプリでは速度改善というと通信やDB周りがボトルネックになることが多いです。Subsonicの場合それ以外の要素が大きいです。そのため頭ごなしにDB変更という路線にはネガティブです。再現性のある検証と効果測定がないと話は回りますし、下手すると致命的な不具合を併発します。変化を恐れているわけではなく、バグの原因をチャレンジとすり替えるコミュニティを敬遠しているだけです。
ですのでなにか改善案がございましたら、ユーザにはどのような恩恵があるかの説明や検証等も併せてご提案頂ければ幸いです。私の方針というよりも、ジョブチューン風に日本の技術者7人くらい集めて「Yes」の札が4つ以上になるような立案を目指して頂ければ、かなりの確率で「アリ」なのではないかと思います。
更新履歴
この記事を書き換えたときに以下に追記します。
- v112.0.0
- Webページの仕様変更により接続方法に関する記載を全体的に書き換え
- v111.0.0
- 「Jpsonicの内部DBに接続しよう(v109.1.0)」と「Jpsonic を外部DBで使ってみよう (v105.2.1)」を併合し、記事内容を圧縮
コメントはまだありません