7. 使用 JDBC 进行数据访问
Spring 广泛支持构建在 JDBC 之上的数据访问技术,例如专用 ORM(JPA、
Hibernate 支持)。Spring Cloud AWS 使应用程序开发人员能够重用他们选择的 JDBC 技术,并使用声明性配置访问 Amazon Relational Database Service。Spring 提供的主要支持
用于 JDBC 数据访问的云 AWS 包括:JdbcTemplate
-
基于 Amazon RDS 数据库实例的自动数据源配置和设置。
-
Amazon RDS 数据库实例的自动只读副本检测和配置。
-
Retry-support 在数据中心内进行多可用区故障转移期间处理异常。
7.1. 配置数据源
在使用和配置数据库支持之前,应用程序必须包含相应的模块依赖项 添加到其 Maven 配置中。Spring Cloud AWS JDBC 支持作为单独的模块提供,以允许模块化使用 模块。
7.1.1. Maven 依赖项配置
Spring Cloud AWS JDBC 模块作为独立模块提供,可以使用以下依赖项声明导入。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-aws-jdbc</artifactId>
<version>{spring-cloud-version}</version>
</dependency>
7.1.2. 数据源的基本配置
数据源配置至少需要 security 和 region 配置,以允许 Spring Cloud AWS 检索
Amazon RDS 服务的数据库元数据信息。Spring Cloud AWS 提供了一个额外的特定命名空间
要使用 Minimum 属性配置数据源,如示例中所示:jdbc
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jdbc="http://www.springframework.org/schema/cloud/aws/jdbc"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/cloud/aws/jdbc
http://www.springframework.org/schema/cloud/aws/jdbc/spring-cloud-aws-jdbc.xsd">
<aws-context:context-credentials>
...
</aws-context:context-credentials>
<aws-context:context-region region="..."/>
<jdbc:data-source
db-instance-identifier="myRdsDatabase"
password="${rdsPassword}">
</jdbc:data-source>
</beans>
最低配置参数对于数据源是唯一的,是一个有效的属性
指向有效的 Amazon RDS 数据库实例。主用户的 master 用户密码。如果有另一个
user (推荐),则可以设置该属性。id
db-instance-identifier
username
使用此配置, Spring Cloud AWS 获取所有必要的元数据,并创建具有默认属性的 Tomcat JDBC 池。数据源 可以稍后注入到任何 Spring Bean 中,如下所示:
@Service
public class SimpleDatabaseService implements DatabaseService {
private final JdbcTemplate jdbcTemplate;
@Autowired
public SimpleDatabaseService(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
}
可以使用注释限定数据源注入点以允许多个数据源
配置,并且仍然使用自动连接。@Qualifier
7.1.3. 数据源池配置
Spring Cloud AWS 使用默认属性创建一个新的 Tomcat JDBC 池。通常,这些默认属性不满足 应用程序对池大小和其他设置的要求。数据源配置支持 具有嵌套 XML 元素的所有有效池属性。以下示例演示了数据源的重新配置 具有自定义池属性。
<beans ..>
<aws-context:context-credentials>
...
</aws-context:context-credentials>
<aws-context:context-region region="..."/>
<jdbc:data-source
db-instance-identifier="myRdsDatabase"
password="${rdsPassword}">
<jdbc:pool-attributes initialSize="1" " maxActive="200" minIdle="10"
testOnBorrow="true" validationQuery="SELECT 1" />
</jdbc:data-source>
</beans>
此处提供了所有配置属性及其值的完整列表。
7.2. 使用 Java 配置配置数据源
Spring Cloud AWS 还支持在类中配置数据源。注释可用于配置一个数据
源。多个数据源可用于配置多个数据源。每个注释将只生成一个
数据源 Bean 的 Bean 中。@Configuration
org.springframework.cloud.aws.jdbc.config.annotation.EnableRdsInstance
下面的类显示了配置类中的数据源配置
@Configuration
@EnableRdsInstance(dbInstanceIdentifier = "test",password = "secret", readReplicaSupport = true)
public class ApplicationConfiguration {
}
XML 元素中的配置属性相同。必需的属性也是相同的
对于 XML 配置(and 属性)dbInstanceIdentifier password |
7.2.1. 基于 Java 的数据源池配置
还可以使用自定义值覆盖池配置。Spring Cloud AWS 提供了一个创建可能包含自定义池属性的 a 。下一个
Examples 显示了一个覆盖 validation 查询和初始大小的 Configurer 的实现。org.springframework.cloud.aws.jdbc.config.annotation.RdsInstanceConfigurer
org.springframework.cloud.aws.jdbc.datasource.DataSourceFactory
@Configuration
@EnableRdsInstance(dbInstanceIdentifier = "test",password = "secret")
public class ApplicationConfiguration {
@Bean
public RdsInstanceConfigurer instanceConfigurer() {
return new RdsInstanceConfigurer() {
@Override
public DataSourceFactory getDataSourceFactory() {
TomcatJdbcDataSourceFactory dataSourceFactory = new TomcatJdbcDataSourceFactory();
dataSourceFactory.setInitialSize(10);
dataSourceFactory.setValidationQuery("SELECT 1 FROM DUAL");
return dataSourceFactory;
}
};
}
}
此类返回 类型为 的匿名类 ,
当然,这也可能是一个独立的类。org.springframework.cloud.aws.jdbc.config.annotation.RdsInstanceConfigurer |
7.3. 在 Spring Boot 中配置数据源
还可以使用 Spring Boot 配置文件配置数据源。由于 数据源,则必须为每个数据源配置 Spring Boot 属性。
数据源配置由数据源标识符的常规属性名称组成
在特定数据源的 sub 属性后面,其中 是具体实例的名称。下表
概述了用作实例标识符的数据源的所有属性。cloud.aws.rds.<instanceName>
instanceName
test
财产 | 例 | 描述 |
---|---|---|
cloud.aws.rds.test.password |
verySecret |
数据库实例测试的密码 |
cloud.aws.rds.test.username |
管理 |
数据库实例测试的用户名(可选) |
cloud.aws.rds.test.readReplicaSupport |
真 |
如果应将只读副本用于数据源(请参阅下文) |
cloud.aws.rds.test.databaseName |
fooDb 数据库 |
自定义数据库名称(如果不应使用 rds 中的默认数据库名称) |
7.4. 只读副本配置
Amazon RDS 允许使用 MySQL、MariaDB、Oracle、PostgreSQL 和 Microsoft SQL Server 只读副本实例,通过将读取数据访问卸载到一个或多个只读副本来提高数据库的整体吞吐量 slaves 同时将数据维护在一个 master 数据库中。
Spring Cloud AWS 支持将只读副本与 Spring 只读事务结合使用。如果只读副本 support 启用后,在使用 master 数据库时,任何只读事务都将被路由到只读副本实例 用于写入操作。
使用只读副本实例并不能保证数据库的严格 ACID 语义 可及性,应谨慎使用。这是因为只读副本可能滞后,而写入可能不是 立即对 read 事务可见。因此,建议仅将只读副本实例用于读取 不经常更改的数据,并且应用程序可以处理过时的数据。 |
可以使用 datasource 配置中的属性启用只读副本支持。read-replica
<beans ..>
<jdbc:data-source db-instance-identifier="RdsSingleMicroInstance"
password="${rdsPassword}" read-replica-support="true">
</jdbc:data-source>
</beans>
Spring Cloud AWS 将搜索为 master 数据库创建的任何只读副本,并路由只读事务 添加到可用的只读副本之一。可以实现使用只读副本的业务服务,如下所示 在示例中。
@Service
public class SimpleDatabaseService {
private final JdbcTemplate jdbcTemplate;
@Autowired
public SimpleDatabaseService(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
@Transactional(readOnly = true)
public Person loadAll() {
// read data on the read replica
}
@Transactional
public void updatePerson(Person person) {
// write data into database
}
}
7.5. 故障转移支持
Amazon RDS 在以下情况下支持多可用区故障转移 由于主实例中断或故障,一个可用区不可用。复制是同步的 (与只读副本相比)并提供持续服务。Spring Cloud AWS 支持多可用区故障转移和重试 恢复在多可用区故障转移期间失败的事务的机制。
在大多数情况下,最好向用户提供直接反馈,而不是尝试可能长时间且频繁的重试 用户交互。因此,故障转移支持主要适用于批处理应用程序或 服务调用的响应能力并不重要。 |
Spring Cloud AWS JDBC 模块提供了一个重试拦截器,可用于使用拦截器装饰服务。 如果由于多可用区故障转移而出现临时错误,拦截器将再次重试数据库操作。A 多可用区 故障转移通常只持续几秒钟,因此重试业务事务可能会成功。
拦截器可以配置为常规 bean,然后由切入点表达式使用它来装饰相应的 方法调用。拦截器必须具有已配置的数据库来检索当前状态(如果它 是临时故障转移或永久错误)。
拦截器的配置可以通过 Spring Cloud AWS jdbc 命名空间中的自定义元素来完成,并且 将进行配置,如下所示:
<beans ..>
<jdbc:retry-interceptor id="myInterceptor"
db-instance-identifier="myRdsDatabase"
max-number-of-retries="10" />
</beans>
拦截器本身可以与任何 Spring advice 配置一起使用,以包装相应的服务。切入点 对于前面章节中所示的服务,可以定义如下:
<beans ..>
<aop:config>
<aop:advisor advice-ref="myInterceptor" pointcut="bean(simpleDatabaseService)" order="1" />
</aop:config>
</beans>
重要的是,在事务拦截器之外调用拦截器,以确保整个事务 将重新执行。在事务拦截器中配置拦截器将导致永久性错误,因为 断开的连接将永远不会刷新。 |
上述配置与交易配置相结合,将产生以下代理配置 对于服务。
7.6. CloudFormation 支持
Spring Cloud AWS 支持配置了 CloudFormation 的数据库实例。Spring Cloud AWS 可以使用逻辑 name 中,并使用生成的物理资源名称查找具体数据库。数据库 可以在 CloudFormation 中使用模板定义轻松配置配置,其模板定义可能如下所示 例。
"myRdsDatabase": {
"Type": "AWS::RDS::DBInstance",
"Properties": {
"AllocatedStorage": "5",
"DBInstanceClass": "db.t1.micro",
"DBName": "test",
"Engine": "mysql",
"MasterUsername": "admin",
"MasterUserPassword": {"Ref":"RdsPassword"},
...
}
},
"readReplicaDatabase": {
"Type": "AWS::RDS::DBInstance",
"Properties": {
"AllocatedStorage" : "5",
"SourceDBInstanceIdentifier": {
"Ref": "myRdsDatabase"
},
"DBInstanceClass": "db.t1.micro"
}
}
}
然后,可以使用模板中设置的名称配置数据库。此外,只读副本可以 以在应用程序中使用配置的只读副本数据库。要使用的配置配置的 数据库概述如下:
<beans>
<aws-context:stack-configuration/>
<jdbc:data-source db-instance-identifier="myRdsDatabase" password="${rdsPassword}" read-replica-support="true"/>
</beans>
7.7. 数据库标签
Amazon RDS 实例还可以使用 RDS 数据库特定的标签进行配置,从而允许用户配置数据库特定的
配置元数据。可以使用属性
在元素上。配置标签支持,如下例所示:user-tags-map
data-source
<jdbc:data-source
db-instance-identifier="myRdsDatabase"
password="${rdsPassword}" user-tags-map="dbTags" />
这允许开发人员使用表达式访问代码中的属性,如下面的类中所示:
public class SampleService {
@Value("#{dbTags['aws:cloudformation:aws:cloudformation:stack-name']}")
private String stackName;
}
数据库标签是默认标签,如果
数据库使用 CloudFormation 进行配置。 |