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 スライスとは何ですか?

推薦する

CentOS IP接続ネットワーク実装プロセス図

1. システムにログインし、ディレクトリに入ります: cd /etc/sysconfig/netwo...

HTML でフォーム入力やその他のテキスト ボックスを読み取り専用にして編集不可にする方法

場合によっては、フォーム内のテキスト ボックスを読み取り専用にして、ユーザーがその中の情報を変更でき...

指定フィールドによるMySQLカスタムリストのソートの実装

問題の説明ご存知のとおり、MySQL でフィールドを昇順に並べ替える SQL は次のとおりです (i...

mySQLキーワードの実行優先度の説明

以下のように表示されます。表から条件フィールドでグループ化仮想テーブルとフィールドを作成し、フィール...

css3 flexレイアウト justify-content:space-between 最後の行は左揃えになります

justify-content:space-betweenレイアウトを使用する場合、要素の最後の行に...

docker compose を使用して fastDFS ファイル サーバーを構築する方法

前回の記事では、docker compose を使用して FastDfs ファイル サーバーをインス...

Jira リバース プロキシを実装するための nginx について

概要: nginx リバース プロキシ jira を構成し、https を実装します。Tomcat ...

Docker ベースのよく使われる CentOS7 イメージの概要

目次1 Dockerをインストールする2 国内ミラーソースの設定3 中国語環境基本版Centos7イ...

Windows 10 に付属する仮想マシンのネットワークを設定するための詳細な手順 (グラフィック チュートリアル)

1. サーバー ホストをクリックし、右側の操作リストで [仮想スイッチ管理] をクリックして、仮想...

HTML の隠しフィールドの紹介と例

基本的な構文: <input type="hidden" name=&qu...

HBuilderX で Tomcat 外部サーバーを設定して、JSP インターフェイスを表示および編集する方法の詳細な説明

1. 最初の方法は、ローカルのTomcatを起動してJSPを表示することです。 tomcatのweb...

Mysqlはフィールドスプライシングのための3つの関数を実装している

データをオペレーションにエクスポートする場合、フィールドの結合は避けられません。MySQL でこれが...

MySQL シリーズ 12 バックアップとリカバリ

目次チュートリアルシリーズ1. バックアップ戦略の説明1. バックアップの種類2. バックアップで考...

JavaScriptはイベントリスナーをイベント委任にバッチで追加します。詳細なプロセス

1. イベント委任とは何ですか?イベント委譲: イベントバブリングの特性を利用して、子要素に登録すべ...

Docker+Jenkinsによる自動デプロイの実現方法

Code Cloud を使用して Git コード ストレージ ウェアハウスを構築するhttps://...