Service Builderを外部データベースに接続する
サービスビルダーは、Liferayで使用される他のすべてのデータとともに、 lportal データベースにサービスに必要なテーブルを作成します。 データを別のデータベースに保存する場合は、 データソースプロバイダ を使用してサービスビルダーを接続できます。 こうすることで、モジュールからのすべてのデータを含むデータベースを個別にホストしたり、異なるアクセス権限を設定したり、その他多くのことが可能になります。
Service Builder サービスでネストされたトランザクションが必要な場合、外部データソースの使用は適切ではない可能性があります。 異なるデータソース間のトランザクションは、完全にネストすることはできません。 外部データソースを使用するサービスと、異なるデータソースを使用するLiferay DXPサービス(または他のアプリケーションのサービス)の間では、ロールバックが伝播されない場合があります。
サンプルをデプロイする
新しいLiferay インスタンスを起動し、以下を実行します。
docker run -it -m 8g -p 8080:8080 liferay/portal:7.4.3.132-ga132
http://localhost:8080 で Liferay にサインインしてください。 メールアドレス test@liferay.com とパスワード test を使用してください。 プロンプトが表示されたら、パスワードを learnに変更します。
サンプルをデプロイするには、以下の手順に従ってください。
-
ポータルのプロパティを使用してデータソースを定義します。 データソースに
jdbc.default.以外のプレフィックスを付けることで、Liferay のデフォルトのデータソースと区別できます。。 この PostgreSQL の設定例では、プレフィックスjdbc.ext.を使用しています。:jdbc.ext.driverClassName=org.postgresql.Driver jdbc.ext.url=jdbc:postgresql://localhost:5432/lportal jdbc.ext.username= jdbc.ext.password= -
ポータルプロパティを使用してデータソースを定義した場合は、Liferay Portalインスタンスを再起動してください。
-
liferay-y3c4.zipサンプルプロジェクトをダウンロードして解凍します。curl https://resources.learn.liferay.com/examples/liferay-y3c4.zip -Ounzip liferay-y3c4.zip -
プロジェクトモジュールをビルドしてデプロイします。
cd liferay-y3c4./gradlew deploy -Ddeploy.docker.container.id=$(docker ps -lq)注このコマンドは、デプロイされた jar ファイルを Docker コンテナ上の
/opt/liferay/osgi/modulesにコピーすることと同じです。 -
Liferay Dockerコンテナコンソールでデプロイを確認します。
STARTED com.liferay.y3c4.web_1.0.0 [1386] STARTED com.liferay.y3c4.api_1.0.0 [1384] STARTED com.liferay.y3c4.service_1.0.0 [1385] -
サンプルモジュールが正しく動作していることを確認するには、データベースを開いてテーブルの一覧を表示してください。
データソースプロバイダーの作成
外部データベースに接続する最も簡単な方法は、JDK ServiceProviderInterface (SPI) として DataSourceProvider を作成して登録することです。
Service Builder モジュールの service.xml ファイルで定義されているすべてのエンティティは、同じデータ ソースにバインドされます。 異なるエンティティを異なるデータソースにバインドするには、エンティティを個別のService Builderモジュールで定義し、各モジュールが異なるデータソースを使用するように構成する必要があります。
DataSourceProviderインターフェイスのgetDataSource()メソッドを実装して、Service Builder モジュールをデータ ソースに接続します。
public class DataSourceProviderImpl implements DataSourceProvider {
@Override
public DataSource getDataSource() {
DataSourceProvider を *-service モジュールに配置してください。これは、 *-service モジュールのクラスローダーから見えるようにする必要があるためです。
- 選択したプレフィックスを持つポータル プロパティからデータ ソースを作成するには、
DataSourceFactoryUtilを使用します。
@Override
public DataSource getDataSource() {
try {
return DataSourceFactoryUtil.initDataSource(
PropsUtil.getProperties("jdbc.ext.", true));
}
catch (Exception exception) {
throw new RuntimeException(exception);
}
}
-
*-serviceモジュール内に、src/main/resources/META-INF/servicesという名前のフォルダがまだ存在しない場合は作成します。 -
servicesフォルダー内に、com.liferay.portal.kernel.dao.jdbc.DataSourceProviderという名前のファイルを作成します。 -
データソースプロバイダを JDK
ServiceProviderInterface(SPI) として登録するには、クラス名全体をcom.liferay.portal.kernel.dao.jdbc.DataSourceProviderファイルに書き込みます。
com.liferay.y3c4.internal.dao.jdbc.DataSourceProviderImpl
- モジュールをデプロイする際は、 サンプルをデプロイする の手順 2 で行ったようにデータ ソースを定義することを忘れないでください。
これで、 モジュールのサービスビルダーサービスは、外部データソースにデータを永続化します。