Upgrading Data Schemas
ご覧のページは、お客様の利便性のために一部機械翻訳されています。また、ドキュメントは頻繁に更新が加えられており、翻訳は未完成の部分が含まれることをご了承ください。最新情報は都度公開されておりますため、必ず英語版をご参照ください。翻訳に問題がある場合は、 こちら までご連絡ください。

マルチスレッド処理

Liferay DXP 7.4 U10+ または Liferay Portal 7.4 GA14+

アップグレードプロセス では、大規模なデータセットに対して複雑な変更を行う場合があります。 パフォーマンスがクリティカルな場合は、アプリケーションのUpgradeProcessクラスのprocessConcurrently()メソッドを使用するようにしてください。 このメソッドは複数のスレッドで実行されるため、アップグレードの時間を短縮することができます。

バージョン1.0.0をデプロイする

Liferay DXP の新しいインスタンスを起動するには、以下を実行します。

docker run -it -m 8g -p 8080:8080 liferay/dxp:2026.q1.9-lts

http://localhost:8080 に、メールアドレス test@liferay.com とパスワード test を使用して Liferay にサインインします。 プロンプトが表示されたら、パスワードを learn に変更してください。

次に、以下の手順に従います。

  1. マルチスレッド処理 をダウンロードして解凍します。

    curl https://resources.learn.liferay.com/examples/liferay-j7z3.zip -O
    
    unzip liferay-j7z3.zip
    
  2. 1.0.0 ディレクトリに移動し、ビルドしてデプロイします。

    CD 1.0.0
    
    ../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
    注記

    このコマンドは、デプロイされたjarファイルをDockerコンテナの/opt/liferay/osgi/modulesにコピーするのと同じです。

  3. Liferay Dockerコンテナコンソールでデプロイメントを確認してください。

    com.acme.j7z3.api_1.0.0 [1030] を開始しました
    com.acme.j7z3.service_1.0.0 [1031] を開始しました
    

アプリにエントリーを追加する

  1. コントロール パネル → サーバー管理 → スクリプト の順に移動して、スクリプト コンソールを開きます。

  2. 以下のスクリプトを実行して、エントリを追加してください。

    import com.acme.j7z3.service.J7Z3EntryLocalServiceUtil;
    
    import com.liferay.portal.kernel.dao.orm.QueryUtil;
    
    entry1 = J7Z3EntryLocalServiceUtil.createJ7Z3Entry(1);
    entry2 = J7Z3EntryLocalServiceUtil.createJ7Z3Entry(2);
    entry3 = J7Z3EntryLocalServiceUtil.createJ7Z3Entry(3);
    
    entry1.setName("able");
    entry2.setName("able");
    entry3.setName("able");
    
    J7Z3EntryLocalServiceUtil.addJ7Z3Entry(entry1);
    J7Z3EntryLocalServiceUtil.addJ7Z3Entry(entry2);
    J7Z3EntryLocalServiceUtil.addJ7Z3Entry(entry3);
    

    J7Z3_J7Z3Entryテーブルには現在3つのエントリがあります。

    これら3つのエントリは、データベーステーブルで確認できます。

アップグレードを実行する

  1. 1.0.1 ディレクトリに移動し、ビルドしてデプロイします。

    cd ../1.0.1
    
    ../gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)
    
  2. コントロール パネル → Gogo シェル で Gogo シェル コンソールに移動します。

  3. upgrade:list com.acme.j7z3.service と入力して、1.0.1 アップグレードが利用可能であることを確認します。 出力ウィンドウには、バージョン1.0.1が登録済みのアップグレードプロセスとして表示されます。

  4. コマンド upgrade:execute com.acme.j7z3.service を入力してアップグレードを実行します。 出力ウィンドウには、アップグレードが完了したことが示されています。

    アップグレードを実行すると、アップグレードが完了したことを示す出力が表示されるはずです。

  5. J7Z3_J7Z3Entryテーブルのエントリが更新されました。

    更新されたエントリはデータベーステーブルで確認できます。

マルチスレッド方式を実装する

アプリケーションの UpgradeProcess クラスで、 processConcurrently() メソッドをオーバーライドします。

@Override
protected void doUpgrade() throws Exception {
	processConcurrently(
		"select j7z3EntryId, name from J7Z3_J7Z3Entry",
		resultSet -> new Object[] {
			resultSet.getLong("j7z3EntryId"), resultSet.getString("name")
		},
		columns -> {
			long j7z3EntryId = (Long)columns[0];

			try (PreparedStatement preparedStatement =
					connection.prepareStatement(
						"update J7Z3_J7Z3Entry set name = ? where " +
							"j7z3EntryId = ?")) {

				preparedStatement.setString(1, "baker");
				preparedStatement.setLong(2, j7z3EntryId);

				preparedStatement.executeUpdate();
			}
		},
		null);
}

この方法は4つの部分から成ります。

  1. SQLクエリ - データベースデータを照会するためのSQL文。

  2. オブジェクトの収集 - 結果セットを受け取り、結果セットに基づいてオブジェクトの配列を返します。

  3. オブジェクトの処理 - オブジェクトの配列に対してビジネスロジックを実行します。

  4. 例外 - 例外が発生した場合にメッセージを送信します。

サンプルプロジェクトでは、 name フィールドが processConcurrently() メソッドによって処理および変更される簡単な例を示しています。

  1. select j7z3EntryId, name from J7Z3_J7Z3Entry - SQL ステートメントはすべてのエントリをクエリします。

  2. resultSet -> new Object[] {
    		 resultSet.getLong("j7z3EntryId"), resultSet.getString("name")
    }
    

    オブジェクトは収集され、 resultSet 配列に格納されます。

  3. 列 -> {
    	    long j7z3EntryId = (Long)columns[0];
    
    	    try (PreparedStatement preparedStatement =
    			  connection.prepareStatement(
    				   "update J7Z3_J7Z3Entry set name = ? where " +
    					    "j7z3EntryId = ?")) {
    
    		     preparedStatement.setString(1, "baker");
    		     preparedStatement.setLong(2, j7z3EntryId);
    
    		     preparedStatement.executeUpdate();
    		 }
    }
    

    j7z3EntryIdごとに、 name フィールドが baker に設定されます。

  4. 例外は null に設定されます。

processConcurrently() の代替実装

processConcurrently() メソッドには 2 つの代替シグネチャがあります。 最初の方法は、パフォーマンス向上のために自動バッチ処理を使用します。 J7Z3EntryUpgradeProcess.java ファイルで、 processConcurrently() の使用箇所を次のコードに置き換えてください。

processConcurrently(
    "select j7z3EntryId, name from J7Z3_J7Z3Entry",
    "update J7Z3_J7Z3Entry set name = ? j7z3EntryId = ? の場合"、
    resultSet -> new Object[] {
        resultSet.getLong("j7z3EntryId"), resultSet.getString("name")
    }、
    (columns、preparedStatement) -> {
        long j7z3EntryId = (Long)columns[0];

        preparedStatement.setString(1, "baker");
        preparedStatement.setLong(2, j7z3EntryId);

        preparedStatement.addBatch();
    },
    null);

この署名には以下のパラメータがあります。

  1. 元の実装と同様に、最初の引数は処理対象データを取得するためのSQLクエリです。

  2. 2番目の引数は、メソッドによって制御されるバッチ内でデータを挿入、更新、または削除するためのSQLクエリです。

  3. 3番目の引数は、元の実装における関数と同様の関数です。

    resultSet -> new Object[] {
    		 resultSet.getLong("j7z3EntryId"), resultSet.getString("name")
    }
    
  4. 4番目の引数も同様の機能を持っています。

    (columns, preparedStatement) -> {
        long j7z3EntryId = (Long)columns[0];
        preparedStatement.setString(1, "baker");
        preparedStatement.setLong(2, j7z3EntryId);
        preparedStatement.addBatch();
    }
    
  5. 最後の引数は、例外が発生した場合に使用される 文字列 です。

ヒント

SQLデータの更新または挿入のみを行うシンプルなアップグレードには、この署名を使用してください。 データの挿入以上の操作(ファイルの削除や画像の追加など)を行うアップグレードには、 以前の署名 を使用してください。

もう一方のシグネチャは、ソースとして配列を渡します。 詳細については、 BaseDBProcess の Javadoc を参照してください。