見出し画像

【劔"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/

いいなと思ったら応援しよう!