メインコンテンツへスキップ
見出し画像

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

    あなたへのおすすめ