MySQL での r2dbc の使用に関する詳細な理解

MySQL での r2dbc の使用に関する詳細な理解

導入

MySQL は、私たちが日常業務で使用する非常に一般的なデータベースです。MySQL は現在 Oracle が所有していますが、オープンソースであり、その市場シェアは依然として非常に高いです。

今日は、mysql での r2dbc の使用法を紹介します。

r2dbc-mysql の Maven 依存関係

r2dbc-mysql を使用するには、次の Maven 依存関係を追加する必要があります。

<依存関係>
  <groupId>dev.miku</groupId>
  <アーティファクトID>r2dbc-mysql</アーティファクトID>
  <バージョン>0.8.2.RELEASE</バージョン>
</依存関係>

もちろん、スナップショット バージョンを使用したい場合は、次のようにします。

<依存関係>
  <groupId>dev.miku</groupId>
  <アーティファクトID>r2dbc-mysql</アーティファクトID>
  <バージョン>${r2dbc-mysql.バージョン}.BUILD-SNAPSHOT</バージョン>
</依存関係>

<リポジトリ>
  <id>sonatype スナップショット</id>
  <name>SonaType スナップショット</name>
  <url>https://oss.sonatype.org/content/repositories/snapshots</url>
  <スナップショット>
    <enabled>有効</enabled>
  </スナップショット>
</リポジトリ>

connectionFactory の作成

connectionFactory を作成するためのコードは、実際には r2dbc の標準インターフェースを使用するため、基本的には前述の h2 の作成コードと同じです。

// 注意: クエリ文字列は URL エンコードされている必要があります
接続ファクトリー connectionFactory = 接続ファクトリー.get(
  "r2dbcs:mysql://root:[email protected]:3306/r2dbc?" +
  "zeroDate=use_round&" +
  "sslMode=verify_identity&" +
  "useServerPrepareStatement=true&" +
  "tlsVersion=TLSv1.3%2CTLSv1.2%2CTLSv1.1&" +
  "sslCa=%2Fpath%2Fto%2Fmysql%2Fca.pem&" +
  "sslKey=%2Fpath%2Fto%2Fmysql%2Fclient-key.pem&" +
  "sslCert=%2Fpath%2Fto%2Fmysql%2Fclient-cert.pem&" +
  "sslKeyPassword=キーpemパスワードをここに入力"
)

// Project Reactor を使用して Mono を作成する
Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

違いは、ConnectionFactories によって渡されるパラメータが異なることです。

Unix ドメイン ソケット形式もサポートしています。

// Unix ドメイン ソケットの最小構成
接続ファクトリー connectionFactory = ConnectionFactories.get("r2dbc:mysql://root@unix?unixSocket=%2Fpath%2Fto%2Fmysql.sock")

Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

同様に、ConnectionFactoryOptions から ConnectionFactory を作成することもサポートしています。

ConnectionFactoryOptions オプション = ConnectionFactoryOptions.builder()
  .option(DRIVER, "mysql")
  .option(ホスト, "127.0.0.1")
  .option(USER, "root")
  .option(PORT, 3306) // オプション、デフォルトは3306
  .option(PASSWORD, "database-password-in-here") // オプション、デフォルトは null、null はパスワードがないことを意味します
  .option(DATABASE, "r2dbc") // オプション、デフォルトは null、null はデータベースを指定しないことを意味します
  .option(CONNECT_TIMEOUT, Duration.ofSeconds(3)) // オプション、デフォルトは null、null はタイムアウトなしを意味します
  .option(SSL, true) // オプション、デフォルトの sslMode は「preferred」です。sslMode が設定されている場合は無視されます。
  .option(Option.valueOf("sslMode"), "verify_identity") // オプション、デフォルトは "preferred"
  .option(Option.valueOf("sslCa"), "/path/to/mysql/ca.pem") // sslMode が verify_ca または verify_identity の場合に必須、デフォルトは null、null はサーバ CA 証明書がないことを意味します
  .option(Option.valueOf("sslCert"), "/path/to/mysql/client-cert.pem") // オプション、デフォルトは null、null はクライアント証明書がないことを意味します
  .option(Option.valueOf("sslKey"), "/path/to/mysql/client-key.pem") // オプション、デフォルトは null、null はクライアント キーがないことを意味します
  .option(Option.valueOf("sslKeyPassword"), "key-pem-password-in-here") // オプション、デフォルトは null、null はクライアント キー (つまり "sslKey") のパスワードがないことを意味します
  .option(Option.valueOf("tlsVersion"), "TLSv1.3,TLSv1.2,TLSv1.1") // オプション、デフォルトはサーバーによって自動的に選択されます
  .option(Option.valueOf("sslHostnameVerifier"), "com.example.demo.MyVerifier") // オプション、デフォルトは null、null は標準の検証子を使用することを意味します
  .option(Option.valueOf("sslContextBuilderCustomizer"), "com.example.demo.MyCustomizer") // オプション、デフォルトは何もしないカスタマイザー
  .option(Option.valueOf("zeroDate"), "use_null") // オプション、デフォルトは "use_null"
  .option(Option.valueOf("useServerPrepareStatement"), true) // オプション、デフォルトは false
  .option(Option.valueOf("tcpKeepAlive"), true) // オプション、デフォルトは false
  .option(Option.valueOf("tcpNoDelay"), true) // オプション、デフォルトは false
  .option(Option.valueOf("autodetectExtensions"), false) // オプション、デフォルトは false
  。建てる();
接続ファクトリー connectionFactory = ConnectionFactories.get(オプション);

// Project Reactor を使用して Mono を作成する
Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

または、次の Unix ドメイン ソケット形式:

// Unix ドメイン ソケットの最小構成
ConnectionFactoryOptions オプション = ConnectionFactoryOptions.builder()
  .option(DRIVER, "mysql")
  .option(Option.valueOf("unixSocket"), "/path/to/mysql.sock")
  .option(USER, "root")
  。建てる();
接続ファクトリー connectionFactory = ConnectionFactories.get(オプション);

Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

MySqlConnectionFactory を使用して接続を作成する

上記の例では、一般的な r2dbc API を使用して接続を作成しています。同様に、独自の MySqlConnectionFactory を使用して接続を作成することもできます。

MySqlConnectionConfiguration 構成 = MySqlConnectionConfiguration.builder()
  .ホスト("127.0.0.1")
  .user("ルート")
  .port(3306) // オプション、デフォルトは3306
  .password("database-password-in-here") // オプション、デフォルトは null、null はパスワードがないことを意味します
  .database("r2dbc") // オプション、デフォルトは null、null はデータベースを指定しないことを意味します
  .serverZoneId(ZoneId.of("Continent/City")) // オプション、デフォルトは null、null は接続開始時にサーバーのタイムゾーンを照会することを意味します
  .connectTimeout(Duration.ofSeconds(3)) // オプション、デフォルトは null、null はタイムアウトなしを意味します
  .sslMode(SslMode.VERIFY_IDENTITY) // オプション、デフォルト SslMode.PREFERRED
  .sslCa("/path/to/mysql/ca.pem") // sslMode が VERIFY_CA または VERIFY_IDENTITY の場合に必須、デフォルトは null、null はサーバー CA 証明書がないことを意味します
  .sslCert("/path/to/mysql/client-cert.pem") // オプション、デフォルトではクライアント SSL 証明書はありません
  .sslKey("/path/to/mysql/client-key.pem") // オプション、デフォルトではクライアント SSL キーはありません
  .sslKeyPassword("key-pem-password-in-here") // オプション、デフォルトではクライアント SSL キー パスワードはありません
  .tlsVersion(TlsVersions.TLS1_3, TlsVersions.TLS1_2, TlsVersions.TLS1_1) // オプション、デフォルトはサーバーによって自動的に選択されます
  .sslHostnameVerifier(MyVerifier.INSTANCE) // オプション、デフォルトは null、null は標準の検証子を使用することを意味します
  .sslContextBuilderCustomizer(MyCustomizer.INSTANCE) // オプション、デフォルトは何もしないカスタマイザー
  .zeroDateOption(ZeroDateOption.USE_NULL) // オプション、デフォルトは ZeroDateOption.USE_NULL
  .useServerPrepareStatement() // サーバー準備ステートメントを使用します。デフォルトではクライアント準備ステートメントを使用します。
  .tcpKeepAlive(true) // オプション、TCP キープアライブを制御します。デフォルトは false です
  .tcpNoDelay(true) // オプション、TCP 遅延なしを制御します。デフォルトは false です
  .autodetectExtensions(false) // オプション、拡張子の自動検出を制御します。デフォルトは true です
  .extendWith(MyExtension.INSTANCE) // オプション、拡張機能を手動で拡張機能に拡張します。デフォルトでは自動検出を使用します
  。建てる();
接続ファクトリー connectionFactory = MySqlConnectionFactory.from(構成);

// Project Reactor を使用して Mono を作成する
Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

または、次の Unix ドメイン ソケット メソッド:

// Unix ドメイン ソケットの最小構成
MySqlConnectionConfiguration 構成 = MySqlConnectionConfiguration.builder()
  .unixSocket("/path/to/mysql.sock")
  .user("ルート")
  。建てる();
接続ファクトリー connectionFactory = MySqlConnectionFactory.from(構成);

Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

ステートメントを実行する

まず、パラメータのない単純なステートメントを見てみましょう。

connection.createStatement("INSERT INTO `person` (`first_name`, `last_name`) VALUES ('who', 'how')")
  .execute(); // 1つのResultを含むPublisherを返す

次に、パラメータ付きのステートメントを見てみましょう。

connection.createStatement("`person` (`birth`, `nickname`, `show_name`) VALUES (?, ?name, ?name) に INSERT INTO")
  .bind(0, LocalDateTime.of(2019, 6, 25, 12, 12, 12))
  .bind("name", "Some one") // 1対1のバインディングではなく、ネイティブのインデックスバインディングを2回呼び出すか、名前バインディングを1回呼び出します。
  。追加()
  .bind(0, LocalDateTime.of(2009, 6, 25, 12, 12, 12))
  .bind(1, "私のニックネーム")
  .bind(2, "名前の表示")
  .returnGeneratedValues("生成されたID")
  .execute(); // 2 つの結果を含む Publisher を返します。

パラメータが null の場合、bindNull を使用して null 値をバインドできることに注意してください。

次に、バッチ実行操作を見てみましょう。

接続.createBatch()
  .add("`person` (`first_name`, `last_name`) に VALUES ('who', 'how') を挿入")
  .add("`earth` を更新し、`count` = `count` + 1 を設定し、`id` = 'human' を設定します")
  .execute(); // 2 つの結果を含む Publisher を返します。

取引の実行

トランザクションを実行する例を見てみましょう。

接続.beginTransaction()
  .then(Mono.from(connection.createStatement("INSERT INTO `person` (`first_name`, `last_name`) VALUES ('who', 'how')").execute()))
  .flatMap(結果::getRowsUpdated)
  .thenMany(connection.createStatement("INSERT INTO `person` (`birth`, `nickname`, `show_name`) VALUES (?, ?name, ?name)")
    .bind(0, LocalDateTime.of(2019, 6, 25, 12, 12, 12))
    .bind("name", "誰か")
    。追加()
    .bind(0, LocalDateTime.of(2009, 6, 25, 12, 12, 12))
    .bind(1, "私のニックネーム")
    .bind(2, "名前の表示")
    .returnGeneratedValues("生成されたID")
    。実行する())
  .flatMap(結果::getRowsUpdated)
  .then(接続.commitTransaction());

スレッドプールの使用

データベースの実行効率を向上させ、接続を確立する際のオーバーヘッドを削減するために、一般的なデータベース接続には接続プールの概念が設けられています。同様に、r2dbc にも r2dbc-pool と呼ばれる接続プールがあります。

r2dbc-pool の依存関係:

<依存関係>
 <groupId>io.r2dbc</groupId>
 <artifactId>r2dbc-プール</artifactId>
 <バージョン>${バージョン}</バージョン>
</依存関係>

スナップショット バージョンを使用する場合は、次のように指定することもできます。

<依存関係>
 <groupId>io.r2dbc</groupId>
 <artifactId>r2dbc-プール</artifactId>
 <version>${version}.BUILD-SNAPSHOT</version>
</依存関係>

<リポジトリ>
 <id>spring-libs-スナップショット</id>
 <name>Spring スナップショット リポジトリ</name>
 <url>https://repo.spring.io/libs-snapshot</url>
</リポジトリ>

データベース接続プールを指定する方法を見てみましょう。

ConnectionFactory connectionFactory = ConnectionFactories.get("r2dbc:pool:<my-driver>://<host>:<port>/<database>[?maxIdleTime=PT60S[&…]");

パブリッシャー<? extends Connection> connectionPublisher = connectionFactory.create();

ご覧のとおり、接続 URL にプール ドライバーを追加するだけで済みます。

同様に、ConnectionFactoryOptions を通じて作成することもできます。

接続ファクトリー connectionFactory = ConnectionFactories.get(ConnectionFactoryOptions.builder()
  .option(DRIVER, "プール")
  .option(PROTOCOL, "postgresql") // ドライバー識別子。PROTOCOL はプールによって DRIVER として委任されます。
  .option(HOST, "…")
  .option(ポート, "…") 
  .option(USER, "...")
  .option(パスワード, "…")
  .option(データベース, "…")
  。建てる());

パブリッシャー<? extends Connection> connectionPublisher = connectionFactory.create();

// 代替案: Project Reactor を使用して Mono を作成する
Mono<Connection> connectionMono = Mono.from(connectionFactory.create());

最後に、ConnectionPoolConfiguration を作成してスレッド プールを直接使用することもできます。

接続ファクトリー connectionFactory = ...;

ConnectionPoolConfiguration 構成 = ConnectionPoolConfiguration.builder(connectionFactory)
  .maxIdleTime(持続時間.ofMillis(1000))
  .最大サイズ(20)
  。建てる();

ConnectionPool プール = 新しい ConnectionPool(構成);
 

Mono<接続> connectionMono = pool.create();

// 後で

接続接続 = …;
Mono<Void> release = connection.close(); // 接続をプールに戻しました

// アプリケーションのシャットダウン
プールを破棄します。

これで、mysql での r2dbc の使用に関する詳細な理解に関するこの記事は終了です。より関連性の高い mysql r2dbc コンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL インストール図 MySQL グラフィック インストール チュートリアル (詳細な手順)
  • Mysql 文字列インターセプション関数 SUBSTRING の使用方法
  • MySQL ユーザーの作成と認証方法
  • mysql update ステートメントの詳細な使用方法
  • MySQL CASE WHEN ステートメントの使用手順
  • MySQL の int、bigint、smallint、tinyint の違いについて詳しく紹介します。
  • mysql インデックスの追加 mysql インデックスの作成方法
  • MySQL での replace の使用

<<:  Dockerビルドキットを使用して、Raspberry Piで使用できるDockerイメージを構築します。

>>:  Web スライスとは何ですか?

推薦する

Dockerコンテナ内にkibanaトークナイザーをインストールする方法

ステップ: 1. 仮想マシンディレクトリに新しいdocker-compose.ymlファイルを作成し...

Linux Bash スクリプトを使用してユーザーを識別する方法の例

多くの場合、bash スクリプト内またはスクリプト自体内で直接 sudo を使用してコマンドを実行す...

要素の$notifyポイントについての簡単な説明

当初の意図は、element-ui の $notify 通知をコンポーネントにカプセル化することでし...

docker-maven-pluginはイメージをパッケージ化し、プライベートウェアハウスにアップロードします。

目次1. docker-maven-pluginの紹介2. 環境とソフトウェアの準備3. デモ例3....

MySQL に大量のデータを挿入するときに重複データを除外する方法

目次1. 問題を発見する2.重複したデータを残さずにすべて削除する3. 削除テーブルから重複データを...

CSS グリッドレイアウトの完全ガイド

Grid は 2 次元のグリッド レイアウト システムです。これを使用すると、本質的にはハック メソ...

VueプロジェクトにPWAを導入する手順

目次1. 依存関係をインストールする2. vue.config.js ファイルで pwa を設定しま...

CSS で background-color を使用して背景画像にマスク効果を追加する 2 つの方法

div で background-color と background-image を同時に設定する...

MySQL InnoDBセカンダリインデックスのソート例の詳細な説明

ソート問題最近、Geek Time の「45 Lectures on MySQL Practice」...

Vue2.x プロジェクトのパフォーマンス最適化のためのコード最適化の実装

目次1 v-ifとv-showの使用2. 計算と監視を区別する3 v-for トラバーサルでは、アイ...

MySQL 完全折りたたみクエリ正規マッチングの詳細な説明

概要前の章では、クエリのフィルター条件について学習しました。MySQL では、like % ワイルド...

Linux インストール MySQL5.6.24 使用手順

Linux インストール MySQL ノート1. MySQL データベース サーバーをインストールす...

IE6かどうかを判定する最短JS(IEの書き方)

ブラウザが IE のどのバージョンであるかを検出するためによく使用される JavaScript コー...