
【劔"Tsurugi" Tips集】WebアプリケーションがIPC接続を使う場合は、アプリケーションサーバーの静的ライブラリにTsubakuroを登録する【運⽤Tips】
*****
こちらの記事は、
Tsurugi Advent Calendar 2024(https://adventar.org/calendars/10853)
に参加しています。
劔"Tsurugi"関連のエンジニアが12月25日までの期間、さまざまな記事を掲載していきます。
是非、こちらもご覧ください!
*****
今回から運用Tipsです。
Tsurugiとの通信を⾏うWebアプリケーションでIPC接続を⾏う場合、再デプロイすると不具合が発⽣することがあります。
IPC接続を⾏う場合、クライアントライブラリーであるTsubakuroはnative library(libtsubakuro.so)をロードしています。(Iceaxeも内部ではTsubakuroを使⽤しているので同じです)
Webアプリケーションのアーカイブ(warファイル)がTsubakuroを含んでいる場合、WebアプリケーションをアプリケーションサーバーにデプロイしてIPC接続を実⾏すると、Javaのクラスローダーがnative libraryをロードします。
この状態でWebアプリケーションを再デプロイすると、クラスローダーが新しくなり、再びnative libraryをロードしようとします。しかしクラスローダーはJavaVM内で既にロード済みのnative libraryを再度ロードすることが出来ないので、例外が発⽣します。
これを回避するには、Tsubakuro(Iceaxe)をWebアプリケーションに含めるのではなく、アプリケーションサーバーの静的ライブラリーに含めます。
以下のようにbuild.gradleを記述して gradlew copyStaticLibs を実⾏すると、IceaxeおよびTsubakuroとそれらが依存しているライブラリーのjarファイルが build/static_libs というディレクトリーに出⼒されます。
これらのjarファイルをアプリケーションサーバーの静的ライブラリーを置く場所にコピーしてください。
build.gradle
plugins {
id 'java'
id 'war'
}
dependencies {
providedCompile 'com.tsurugidb.iceaxe:iceaxe-core:1.6.0'
}
task copyStaticLibs(type: Copy) {
from configurations.providedCompile
into "${buildDir}/static_libs"
}
実⾏例
$ ./gradlew copyStaticLibs
$ ls -1 build/static_libs/
iceaxe-core-1.6.0.jar
jackson-annotations-2.13.3.jar
jackson-core-2.13.3.jar
jackson-databind-2.13.3.jar
java-jwt-3.19.2.jar
jsr305-3.0.2.jar
protobuf-java-3.17.3.jar
slf4j-api-1.7.36.jar
tsubakuro-common-1.6.0.jar
tsubakuro-connector-1.6.0.jar
tsubakuro-explain-1.6.0.jar
tsubakuro-ipc-1.6.0.jar
tsubakuro-proto-1.6.0.jar
tsubakuro-session-1.6.0.jar
tsubakuro-stream-1.6.0.jar
その他の劔"Tsurugi"を使う際に役立つTips集はコチラ!
次世代高速RDB劔"Tsurugi"は、オープンソースで公開中です。
ぜひダウンロードしてみて、触ってみてください。
ダウンロードはコチラから
https://www.tsurugidb.com/