検索

1.2. データソースを設定する

download PDF

次のセクションでは、単一または複数データソースの設定を説明します。説明をシンプルにするために、単一データソースをデフォルトデータソース (名前なし) とします。

1.2.1. 単一データソースを設定する

データソースは、JDBC データソース、リアクティブ、またはその両方になります。これは、プロジェクトエクステンションの設定と選択に応じて決定されます。

  1. 次の設定プロパティーを使用してデータソースを定義します。この場合の db-kind は、接続先のデータベースプラットフォーム (例: h2) を定義します。

    quarkus.datasource.db-kind=h2

    Quarkus は、db-kind データベースプラットフォーム属性に指定された値から、使用するべき JDBC ドライバークラスを推定します。

    注記

    この手順は、アプリケーションが複数のデータベースドライバーに依存する場合にのみ必要です。アプリケーションが単一のドライバーで動作する場合、ドライバーは自動的に検出されます。

    Quarkus には現在、次の種類のビルトインデータベースがあります。

    • DB2: db2
    • Derby: derby
    • H2: h2
    • MariaDB: mariadb
    • Microsoft SQL Server: mssql
    • MySQL: mysql
    • Oracle: oracle
    • PostgreSQL: postgresqlpgsql または pg
    • ビルトインではない種類のデータベースを使用する場合は other を使用し、JDBC ドライバーを明示的に定義します。

      注記

      他のデータベースを使用する で説明されているように、JVM モードの Quarkus アプリケーションでは任意の JDBC ドライバーを使用できます。ただし、ビルトイン以外の種類のデータベースを使用すると、アプリケーションをネイティブ実行可能ファイルにコンパイルする際に機能しない可能性が高くなります。

      ネイティブ実行可能ファイルのビルドの場合、利用可能な JDBC Quarkus エクステンションを使用するか、使用する特定のドライバー用のカスタムエクステンションを提供することが推奨されます。

  2. 次のプロパティーを設定して認証情報を定義します。

    quarkus.datasource.username=<your username>
    quarkus.datasource.password=<your password>

    データソースの 認証情報プロバイダーを使用 して、Vault からパスワードを取得することもできます。

これまでは、JDBC とリアクティブドライバーのどちらを使用しているかにかかわらず、設定は同じでした。データベースの種類と認証情報の定義以外は、使用しているドライバーの種類により異なります。JDBC とリアクティブドライバーは、同時に使用できます。

1.2.1.1. JDBC データソース

JDBC は最も一般的なデータベース接続パターンであり、通常は非リアクティブな Hibernate ORM と組み合わせて使用する場合に必要です。

  1. JDBC データソースを使用する場合は、まず必要な依存関係を追加します。

    1. ビルトイン JDBC ドライバーで使用する場合は、以下のリストからリレーショナルデータベースドライバーの Quarkus エクステンションを選択して追加します。

      • Derby - quarkus-jdbc-derby
      • H2 - quarkus-jdbc-h2

        注記

        H2 データベースと Derby データベースは、"組み込みモード" で実行するように設定できます。ただし、Derby エクステンションでは、組み込みデータベースエンジンのネイティブ実行可能ファイルへのコンパイルはサポートされていません。

        結合テストに関する提案事項は、in-memory データベースを使用してテストする を参照してください。

      • DB2 - quarkus-jdbc-db2
      • MariaDB - quarkus-jdbc-mariadb
      • Microsoft SQL Server - quarkus-jdbc-mssql
      • MySQL - quarkus-jdbc-mysql
      • Oracle - quarkus-jdbc-oracle
      • PostgreSQL - quarkus-jdbc-postgresql
      • 他の JDBC エクステンション (SQLite やその ドキュメント など) は、Quarkiverse にあります。

        たとえば、PostgreSQL ドライバーの依存関係を追加するには、以下を実行します。

        ./mvnw quarkus:add-extension -Dextensions="jdbc-postgresql"
        注記

        ビルトイン JDBC ドライバーエクステンションを使用すると、Agroal エクステンションが自動的に組み込まれます。これは、カスタムおよびビルトインの JDBC ドライバーに適用できる JDBC 接続プール実装です。ただし、カスタムドライバーの場合は Agroal を明示的に追加する必要があります。

    2. カスタム JDBC ドライバーで使用するには、リレーショナルデータベースドライバーのエクステンションとともに quarkus-agroal 依存関係をプロジェクトに追加します。

      ./mvnw quarkus:add-extension -Dextensions="agroal"

      別のデータベースの JDBC ドライバーを使用するには、ビルトインエクステンションがない、または別のドライバーがあるデータベースを使用 します。

  2. JDBC URL プロパティーを定義して JDBC 接続を設定します。

    quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/hibernate_orm_test
    注記

    プロパティー名の接頭辞 jdbc に注意してください。JDBC 固有のすべての設定プロパティーには、接頭辞として jdbc が付いています。リアクティブデータソースの場合、接頭辞は reactive です。

JDBC の設定の詳細は、JDBC URL フォーマットのリファレンス および Quarkus エクステンションとデータベースドライバーのリファレンス を参照してください。

1.2.1.1.1. カスタムデータベースとドライバー

JDBC ドライバーを使用して、Quarkus がエクステンションを提供しないデータベースに接続する必要がある場合は、代わりにカスタムドライバーを使用できます。たとえば、プロジェクトで OpenTracing JDBC ドライバーを使用している場合です。

エクステンションがなければ、ドライバーは JVM モードで実行されている Quarkus アプリケーションで正常に動作します。しかし、アプリケーションをネイティブ実行可能ファイルにコンパイルする際に、ドライバーが機能しない可能性があります。ネイティブ実行可能ファイルを作成する予定がある場合は、既存の JDBC Quarkus エクステンションを使用するか、ドライバー用にエクステンションを提供してください。

警告

OpenTelemetry を優先し、OpenTracing が非推奨になりました。トレーシング情報は、以下の データソースのトレース に関する関連セクションを参照してください。

従来の OpenTracing ドライバーを使用したカスタムドライバー定義の例:

quarkus.datasource.jdbc.driver=io.opentracing.contrib.jdbc.TracingDriver

JVM モードでビルトインサポートがないデータベースへのアクセスを定義した例:

quarkus.datasource.db-kind=other
quarkus.datasource.jdbc.driver=oracle.jdbc.driver.OracleDriver
quarkus.datasource.jdbc.url=jdbc:oracle:thin:@192.168.1.12:1521/ORCL_SVC
quarkus.datasource.username=scott
quarkus.datasource.password=tiger

JDBC 設定オプションや、接続プールサイズなどの他の側面の設定に関する詳細は、JDBC 設定リファレンス セクションを参照してください。

1.2.1.1.2. データソースを消費する

Hibernate ORM を使用すると、Hibernate レイヤーが自動的にデータソースを取得して使用します。

データソースへの in-code アクセスでは、次のように他の Bean としてデータソースを取得する必要があります。

@Inject
AgroalDataSource defaultDataSource;

上記の例のタイプは AgroalDataSource、つまり javax.sql.DataSource サブタイプです。そのため、注入されたタイプとして javax.sql.DataSource も使用できます。

1.2.1.2. リアクティブデータソース

Quarkus では、リアクティブデータソースで使用できるリアクティブクライアントがいくつか提供されています。

  1. 対応するエクステンションをアプリケーションに追加します。

    • DB2: quarkus-reactive-db2-client
    • MariaDB/MySQL: quarkus-reactive-mysql-client
    • Microsoft SQL Server: quarkus-reactive-mssql-client
    • Oracle: quarkus-reactive-oracle-client
    • PostgreSQL: quarkus-reactive-pg-client

      インストールされたエクステンションは、データソース設定で定義した quarkus.datasource.db-kind と一致する必要があります。

  2. ドライバーを追加した後、接続 URL を設定し、接続プールの適切なサイズを定義します。

    quarkus.datasource.reactive.url=postgresql:///your_database
    quarkus.datasource.reactive.max-size=20
1.2.1.2.1. リアクティブ接続プールのサイズ調整

負荷のピーク時の過負荷からデータベースを保護するには、データベースの負荷にスロットリングを適用できるようプールサイズを適切に設定します。適切なサイズは、並列アプリケーションユーザーの数やワークロードの性質など、多くの要因により異なります。

プールサイズの設定が小さすぎると、接続の待機中に一部のリクエストがタイムアウトになる可能性があることに注意してください。

プールサイズ調整プロパティーの詳細は、リアクティブデータソース設定リファレンス セクションを参照してください。

1.2.1.3. JDBC とリアクティブデータソースの同時使用

JDBC エクステンション (と Agroal) および特定の種類のデータベースを処理するリアクティブデータソースエクステンションが含まれている場合、デフォルトで両方が作成されます。

  • JDBC データソースを明示的に無効にするには、以下を実行します。

    quarkus.datasource.jdbc=false
  • リアクティブデータソースを明示的に無効にするには、以下を実行します。

    quarkus.datasource.reactive=false
    ヒント

    ほとんどの場合、JDBC ドライバーとリアクティブデータソースエクステンションは、両方ではなくいずれか一方のみ存在するため、上記の設定はオプションです。

1.2.2. 複数のデータソースを設定する

注記

Hibernate ORM エクステンションは、設定プロパティーを使用した 永続化ユニット の定義をサポートします。永続ユニットごとに、選択したデータソースを参照できます。

複数のデータソースを定義することは、単一のデータソースを定義するのと同じように機能しますが、重要な相違点として名前 (設定プロパティー) を定義する必要があります。

次の例では、3 つの異なるデータソースを示しています。

  • デフォルトのデータソース
  • users という名前のデータソース
  • inventory という名前のデータソース

それぞれの設定は次のとおりです。

quarkus.datasource.db-kind=h2
quarkus.datasource.username=username-default
quarkus.datasource.jdbc.url=jdbc:h2:mem:default
quarkus.datasource.jdbc.max-size=13

quarkus.datasource.users.db-kind=h2
quarkus.datasource.users.username=username1
quarkus.datasource.users.jdbc.url=jdbc:h2:mem:users
quarkus.datasource.users.jdbc.max-size=11

quarkus.datasource.inventory.db-kind=h2
quarkus.datasource.inventory.username=username2
quarkus.datasource.inventory.jdbc.url=jdbc:h2:mem:inventory
quarkus.datasource.inventory.jdbc.max-size=12

設定プロパティーに追加のセクションがあることに注意してください。構文は quarkus.datasource.[optional name.][datasource property] です。

注記

データベースエクステンションが 1 つだけインストールされている場合でも、Quarkus がそれを検出できるように、名前付きデータベースは少なくとも 1 つのビルドタイムプロパティーを指定する必要があります。通常これは db-kind プロパティーですが、Dev Services for Databases ガイドに従って、Dev Services プロパティーを指定して名前付きデータソースを作成することもできます。

1.2.2.1. 名前付きデータソースの注入

複数のデータソースを使用する場合、各 DataSource には、データソースの名前を値として持つ io.quarkus.agroal.DataSource 修飾子もあります。

前のセクションで説明したプロパティーを使用して 3 つの異なるデータソースを設定し、それぞれを次のように注入します。

@Inject
AgroalDataSource defaultDataSource;

@Inject
@DataSource("users")
AgroalDataSource usersDataSource;

@Inject
@DataSource("inventory")
AgroalDataSource inventoryDataSource;

1.2.3. データソースのアクティブ化/非アクティブ化

データソースがビルド時に設定されている場合、デフォルトでは実行時にアクティブになります。つまり、Quarkus はアプリケーションの起動時に対応する JDBC 接続プールまたはリアクティブクライアントを起動します。

実行時にデータソースを非アクティブ化するには、quarkus.datasource[.optional name].activefalse に設定します。その後、Quarkus はアプリケーションの起動時に対応する JDBC 接続プールまたはリアクティブクライアントを開始しません。実行時に対応するデータソースを使用しようとすると、明確なエラーメッセージが表示されて失敗します。

これは、アプリケーションが事前に決定された一連のデータソースを実行時に使用できるようにする場合に特に便利です。

警告

別の Quarkus エクステンションが非アクティブなデータソースに依存する場合、そのエクステンションは起動に失敗する可能性があります。

この場合は、他のエクステンションも非アクティブ化する必要があります。たとえば、here for Hibernate ORM を参照してください。

たとえば、以下の設定を使用します。

quarkus.datasource."pg".db-kind=postgres
quarkus.datasource."pg".active=false
quarkus.datasource."pg".jdbc.url=jdbc:postgresql:///your_database

quarkus.datasource."oracle".db-kind=oracle
quarkus.datasource."oracle".active=false
quarkus.datasource."oracle".jdbc.url=jdbc:oracle:///your_database

実行時quarkus.datasource."pg".active=true を設定すると、PostgreSQL データソースのみが利用でき、実行時に quarkus.datasource."oracle".active=true を設定すると Oracle データソースのみが利用可能になります。

ヒント

カスタム設定プロファイル は、このような設定を単純化するのに役立ちます。上記のプロファイル固有の設定を上記の設定に追加することで、quarkus.profile を設定 するだけで、実行時に永続ユニット/データソースを選択できます (quarkus.profile=prod,pg または quarkus.profile=prod,oracle)。

%pg.quarkus.hibernate-orm."pg".active=true
%pg.quarkus.datasource."pg".active=true
# Add any pg-related runtime configuration here, prefixed with "%pg."

%oracle.quarkus.hibernate-orm."oracle".active=true
%oracle.quarkus.datasource."oracle".active=true
# Add any pg-related runtime configuration here, prefixed with "%pg."
ヒント

また、次のように、現在アクティブなデータソースにリダイレクトする CDI bean プロデューサー を定義すると便利なこともあります。

public class MyProducer {
    @Inject
    DataSourceSupport dataSourceSupport;

    @Inject
    @DataSource("pg")
    AgroalDataSource pgDataSourceBean;

    @Inject
    @DataSource("oracle")
    AgroalDataSource oracleDataSourceBean;

    @Produces
    @ApplicationScoped
    public AgroalDataSource dataSource() {
        if (dataSourceSupport.getInactiveNames().contains("pg")) {
            return oracleDataSourceBean;
        } else {
            return pgDataSourceBean;
        }
    }
}

1.2.4. 単一のトランザクションで複数のデータソースを使用する

デフォルトでは、データソースでの XA サポートは無効になっているため、トランザクションには最大 1 つのデータソースが含まれます。同じトランザクションで複数の非 XA データソースにアクセスしようとすることは安全ではないため、警告が表示されます。

その結果、Quarkus 3.10 以降ではデフォルトでエラーが発生します。

同じトランザクションで複数の JDBC データソースを安全に使用するためには、以下を行います。

  1. JDBC ドライバーが XA をサポートしていることを確認します。すべての サポート対象 JDBC ドライバーはサポートしています が、他の JDBC ドライバー はサポートしていない可能性があります。
  2. データベースサーバーが XA を有効化するように設定されていることを確認します。
  3. quarkus.datasource[.optional name].transactionsxa に設定することで、関連する各データソースに対して XA サポートを明示的に有効にします。

XA を使用すると、1 つのデータソースでのロールバックにより、トランザクションに登録されている他のすべてのデータソースでのロールバックがトリガーされます。

注記

現時点では、リアクティブデータソース上の XA トランザクションはサポートされていません。

注記

トランザクションにデータソース以外のリソースが含まれる場合、それら のリソースは XA トランザクションをサポートしていないか、追加の設定が必要になる可能性があることに注意してください。

1 つのデータソースに対して XA を有効にできない場合:

  • 引き続き、Last Resource Commit Optimization (LRCO) を使用することで、1 つ (複数は不可) のリソースを除くすべてのデータソースに対して XA を有効にできます。
  • 1 つのデータソースのロールバックによって他のデータソースのロールバックをトリガーする必要がない場合は、コードを複数のトランザクションに分割することを検討してください。そのためには、QuarkusTransaction.requiringNew()/@Transactional(REQUIRES_NEW) (推奨) または UserTransaction (より複雑なユースケースの場合) を使用します。
注意

同じトランザクションで複数の非 XA データソースにアクセスできないようにするには、quarkus.transaction-manager.unsafe-multiple-last-resourcesfail に設定します。この値は Quarkus 3.10 以降のデフォルトです。

fail 以外の値の場合、トランザクションロールバックが非 XA データソースの一部にのみ適用される可能性がありますが、他の非 XA データソースはすでに変更をコミットしているため、システム全体が整合しないという状態になります。

Quarkus 3.8 では互換性の理由から、デフォルトで初回発生時に警告が 1 回表示されます (warn-first)。quarkus.transaction-manager.unsafe-multiple-last-resourcesallow に設定することで、複数の非 XA データソースにおける安全ではないトランザクション処理を完全に許可できます。

または、プロパティーを warn-each に設定することで、同じ安全でない動作を許可しながら、問題のある トランザクションごと にログに警告を記録することもできます。

この設定プロパティーの使用は推奨されず、将来的には削除される予定です。削除に備え、アプリケーション修正を計画する必要があります。この機能のユースケースが当てはまり、このオプションを維持する必要がある場合は、Quarkus トラッカー でケースを作成して理由を記載してください。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.