7. JDBC 数据访问
Spring 广泛支持基于 JDBC 构建的数据访问技术,例如JdbcTemplate
和专用 ORM(JPA,
Hibernate 支持)。Spring Cloud AWS 使应用程序开发人员能够重用他们选择的 JDBC 技术,并通过声明性配置访问 Amazon Relational Database Service。Spring 提供的主要支持
用于 JDBC 数据访问的云 AWS 包括:
-
基于 Amazon RDS 数据库实例的自动数据源配置和设置。
-
Amazon RDS 数据库实例的自动只读副本检测和配置。
-
支持重试,用于处理数据中心内多可用区故障转移期间的异常。
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. 基本数据源配置
数据源配置至少需要安全性和区域配置,以允许 Spring Cloud AWS 检索
数据库元数据信息与 Amazon RDS 服务。Spring Cloud AWS 提供了额外的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>
最小配置参数是唯一的id
对于数据源,有效的db-instance-identifier
属性
指向有效的 Amazon RDS 数据库实例。主用户的主用户密码。如果有另一个
用户(推荐),然后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 还支持在@Configuration
类。这org.springframework.cloud.aws.jdbc.config.annotation.EnableRdsInstance
注释可用于配置一个数据
源。可以使用多个数据源来配置多个数据源。每个注释将仅生成一个
数据源 bean。
下面的类显示了配置类中的数据源配置
@Configuration
@EnableRdsInstance(dbInstanceIdentifier = "test",password = "secret", readReplicaSupport = true)
public class ApplicationConfiguration {
}
XML 元素中的配置属性相同。所需的属性也相同
对于 XML 配置(dbInstanceIdentifier 和password 属性) |
7.2.1. 基于Java的数据源池配置
还可以使用自定义值覆盖池配置。Spring Cloud AWS 提供了一个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 属性。
数据源配置由常规属性名称组成cloud.aws.rds.<instanceName>
对于数据源标识符
在特定数据源的子属性之后,其中instanceName
是具体实例的名称。下表
概述数据源的所有属性test
作为实例标识符。
属性 | 示例 | 描述 |
---|---|---|
cloud.aws.rds.test.password |
非常秘密 |
数据库实例测试的密码 |
cloud.aws.rds.test.username |
管理 |
数据库实例测试的用户名(可选) |
cloud.aws.rds.test.readReplica支持 |
true |
是否应将只读副本用于数据源(见下文) |
cloud.aws.rds.test.databaseName |
fooDb(福德布) |
自定义数据库名称(如果不应使用 rds 中的默认数据库名称) |
7.4. 只读副本配置
Amazon RDS 允许使用 MySQL、MariaDB、Oracle、PostgreSQL 和 Microsoft SQL Server 只读副本实例,通过将读取数据访问卸载到一个或多个只读副本来提高数据库的总体吞吐量 从属服务器,同时将数据维护在一个 master 数据库中。
Spring Cloud AWS 支持将只读副本与 Spring 只读事务结合使用。如果只读副本 启用支持时,任何只读事务都将在使用 master 数据库时路由到只读副本实例 用于写入作。
使用只读副本实例并不能保证数据库具有严格的 ACID 语义 访问并应小心使用。这是因为只读副本可能落后,而写入可能不会 对读取事务立即可见。因此,建议仅将只读副本实例用于读取 不经常更改的数据,并且应用程序可以处理过时的数据。 |
可以使用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 模块提供了一个重试拦截器,可用于使用拦截器装饰服务。 如果由于多可用区故障转移而出现临时错误,拦截器将再次重试数据库作。多可用区 故障转移通常只持续几秒钟,因此重试业务事务可能会成功。
拦截器可以配置为常规 bean,然后由切入点表达式用于修饰相应的 方法调用。拦截器必须具有配置的数据库才能检索当前状态(如果 是临时故障转移或永久性错误)。
拦截器的配置可以使用 Spring Cloud AWS jdbc 命名空间中的自定义元素完成,并且 将如图所示配置:
<beans ..>
<jdbc:retry-interceptor id="myInterceptor"
db-instance-identifier="myRdsDatabase"
max-number-of-retries="10" />
</beans>
拦截器本身可以与任何 Spring 通知配置一起使用,以包装相应的服务。切入点 对于前一章中显示的服务,可以定义如下:
<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;
}
数据库标记 |