尝试在PostgreSQL中使用【SAP BTP】CAP的API(Java)
首先
使用SAP Cloud Application Programming Model (CAP) 创建了与HANA DB集成的OData API(Java)。
虽然在Trial环境中可以轻松使用HANA DB,但如果购买并使用它可能会成本较高。
如果不需要像HANA DB那样的规格要求,BTP环境中还有其他选择,例如PostgreSQL。
因此,我尝试了一种使用Java创建的CAP API,使其在PostgreSQL中也可以使用的方法。
先决条件
前提是使用Java CAP Service SDK创建了一个OData API。
【参考】
【SAP BTP】尝试使用Java CAP Service SDK创建OData API(2)
创建一个PostgreSQL实例。
访问PostgreSQL数据库
鉴于我不太了解如何访问PostgreSQL,以为可以直接通过VSCode的扩展功能来访问,但实际情况似乎并非如此,因此我将根据官方文档的说明进行操作。
我們將從本地透過命令行進行連接。(文章的環境是WSL的Ubuntu。)
使用cf cli登錄到環境中,首先確認空間允許SSH訪問。
$ cf login
$ cf allow-space-ssh dev
启用已部署的Java应用程序(capCustom_api)的SSH连接。
(启用后最好重新启动一次。)
$ cf enable-ssh capCustom_api
根据对SSH连接隧道进行端口转发的Java应用程序(capCustom_api),我们将使用空闲的本地端口(63306)进行SSH连接。
(PostgreSQL的主机和端口设置将从Service Binding创建时可以确认的凭据内容中进行配置。)
$ cf ssh -L 63306:<PostgreSQLのホスト>:<PostgreSQLのポート> capCustom_api
连接设置如下。
创建表格和测试数据。
CREATE TABLE demo_Users (
ID INTEGER NOT NULL,
FirstName VARCHAR(100),
LastName VARCHAR(100),
Age INTEGER,
createdAt TIMESTAMP,
createdBy VARCHAR(255),
modifiedAt TIMESTAMP,
modifiedBy VARCHAR(255),
PRIMARY KEY(ID)
);
CREATE VIEW UserService_Users AS SELECT
Users_0.createdAt,
Users_0.createdBy,
Users_0.modifiedAt,
Users_0.modifiedBy,
Users_0.ID,
Users_0.FirstName,
Users_0.LastName,
Users_0.Age
FROM demo_Users AS Users_0;
INSERT INTO demo_Users VALUES(
1/*ID <INTEGER>*/,
'Postgre'/*FIRSTNAME <NVARCHAR(100)>*/,
'太郎'/*LASTNAME <NVARCHAR(100)>*/,
49/*AGE <INTEGER>*/,
DEFAULT/*CREATEDAT <TIMESTAMP>*/,
'PostgreSQL DB'/*CREATEDBY <NVARCHAR(255)>*/,
DEFAULT/*MODIFIEDAT <TIMESTAMP>*/,
'PostgreSQL DB'/*MODIFIEDBY <NVARCHAR(255)>*/
);
INSERT INTO demo_Users VALUES(
2/*ID <INTEGER>*/,
'Postgre'/*FIRSTNAME <NVARCHAR(100)>*/,
'次郎'/*LASTNAME <NVARCHAR(100)>*/,
120/*AGE <INTEGER>*/,
DEFAULT/*CREATEDAT <TIMESTAMP>*/,
'PostgreSQL DB'/*CREATEDBY <NVARCHAR(255)>*/,
DEFAULT/*MODIFIEDAT <TIMESTAMP>*/,
'PostgreSQL DB'/*MODIFIEDBY <NVARCHAR(255)>*/
);
我們已經完成了資料庫的準備工作。
更改CAP API的连接数据库。
因为目前需要每次部署CAP API时都要更改Service Binding,所以需要编辑MTA的mta.yaml文件来改变应用程序的连接目标。
在资源中添加PostgreSQL服务,取代先前的HANA DB,并将其包含在Java模块的requires中。
_schema-version: "3.2"
ID: mtademo
version: 0.0.1
modules:
# customserviceのJavaModule
- name: capCustom_api
type: java
path: customservice
parameters:
buildpack: java_buildpack
properties:
SPRING_PROFILES_ACTIVE: cloud
build-parameters:
builder: custom
commands: [ mvn clean package ]
build-result: "srv/target/*-exec.[wj]ar"
provides:
- name: capCustom-api # required by consumers of CAP services (e.g. approuter)
properties:
srv-url: ${default-url}
# resources -> usePostgresqlの定義を使う
requires:
- name: usePostgresql
properties:
JBP_CONFIG_RESOURCE_CONFIGURATION: '[tomcat/webapps/ROOT/META-INF/context.xml:
{"service_name_for_DefaultDB" : "~{hdi-container-name}"}]'
resources:
# 作成済みのHANA DBサービスをresourcesに記載
# - name: useDemoShared
# parameters:
# service-name: demoShared
# service: hanatrial
# service-plan: securestore
# config:
# schema: sampleSchema
# properties:
# hdi-container-name: '${service-name}'
# type: org.cloudfoundry.existing-service
# 作成済みのPostgreSQLサービスをresourcesに記載
- name: usePostgresql
parameters:
service-name: demoPostgreSQL
service: postgresql-db
service-plan: trial
properties:
hdi-container-name: '${service-name}'
type: org.cloudfoundry.existing-service
将BTP部署到环境中。
修改 mta.yaml 后,执行 Build→Deploy。
$ mbt build
$ cf deploy mta_archives/mtademo_0.0.1.mtar
我已确认「KYOSO花子」已在PostgreSQL中注册。
备注:
在部署MTA并重新创建服务绑定时,数据库的用户名/密码发生了更改。
需要再次确认凭据。
最后
我成功地将使用Java创建的CAP API与PostgreSQL连接起来。
我认为有些系统可能会使用PostgreSQL而不是HANA,所以如果有一种通用的方法可以在两者之间切换使用,那会很方便。
但是,我意识到在使用CAP和PostgreSQL时也会有一些限制,所以在开始之前需要先确认。在Java中的数据库支持。