当使用 Hibernate 响应式与 AWS RDS 时,必须确保在操作数据库时存在 Vert.x 上下文。解决此问题的一种方法是使用 AWS SDK for Java 的 AWS Secrets Manager 凭据提供程序,并将其与 Vert.x 或 Vert.x RxJava 集成。以下是使用 Vert.x RxJava 的示例代码:
// 从 AWS Secrets Manager 中获取凭据
AWSClientCredentials awsCreds = AWSClientCredentials.create(new DefaultAWSCredentialsProviderChain());
SecretsManagerClient secretsManagerClient = SecretsManagerClient.builder()
.credentialsProvider(awsCreds.getProvider())
.region(Region.US_EAST_1)
.build();
GetSecretValueRequest getSecretValueRequest = GetSecretValueRequest.builder()
.secretId("myDatabaseCredentials")
.build();
// 获取数据库凭据并使用 Vert.x 上下文创建数据库连接
Maybe connectionMaybe = Single.fromFuture(secretsManagerClient.getSecretValue(getSecretValueRequest))
.map(secret -> Json.decodeValue(secret.secretString(), JsonObject.class))
.map(credentials -> PgPool.pool(Vertx.vertx(), new PgConnectOptions()
.setHost(credentials.getString("host"))
.setPort(credentials.getInteger("port"))
.setDatabase(credentials.getString("database"))
.setUser(credentials.getString("username"))
.setPassword(credentials.getString("password")),
new PoolOptions().setMaxSize(5)));
// 在 Vert.x 上下文中使用响应式 Hibernate 实体类和数据库连接执行操作
context.runOnContext(() -> {
Uni.createFrom().item(new ExampleEntity("John", "Doe"))
.flatMap(entity -> Uni.createFrom().voidItem()
.invoke(() -> System.out.println("Saving entity: " + entity)))
.flatMap(() -> connectionMaybe.toUni())
.flatMap(connection -> ReactiveSqlClient.newInstance(connection)
.preparedQuery("INSERT INTO example_entity (first_name, last_name) VALUES ($1, $2)")
.execute(Tuple.of("John", "Doe")))
.flatMap(resultSet -> Uni.createFrom().voidItem()
.invoke(() -> System.out.println("Rows inserted: " + resultSet.rowCount())))
.flatMap
上一篇:AWSRDS中的“FreeStorageSpace”为什么要以MB/Sec为单位度量?
下一篇:AWSRDS中使用Pgadmin4连接Postgres14时出现sslsyscallerrorconnectiontimedout错误。