我已经在亚马逊网络服务中创建了一个Aurora PostgreSQL集群:
+ mydb (Role: Regional), (Engine: Aurora PostgreSQL), (Region and AZ: ap-southeast-2)
|
+- foo (Role: Writer), (Engine: Aurora PostgreSQL), (Region and AZ: ap-southeast-2a), Multi-AZ (2 Zones)
|
+- bar (Role: Reader), (Engine: Aurora PostgreSQL), (Region and AZ: ap-southeast-2b), Multi-AZ (2 Zones)Writer实例有一个端点,Reader实例有一个端点:
| Endpoint name | Type |
|-------------------------------------------------------|--------|
| mydb.cluster-1234.ap-southeast-2.rds.amazonaws.com | Writer |
| mydb.cluster-ro-1234.ap-southeast-2.rds.amazonaws.com | Reader |在我的应用中,我像往常一样定义了一个数据源:
spring:
datasource:
url: jdbc:postgresql://mydb.cluster-1234.ap-southeast-2.rds.amazonaws.com:5432/someDb?currentSchema=someSchema
username: someUser
password: somePass同样,代码中还定义了一些普通的实体和存储库:
public interface ThingRepository extends JpaRepository<Thing, Long> {
}
@Entity
public class Thing {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Basic
private String name;
// etc.
}同样,还有一些普通的读/写操作:
public void doSomething() {
Thing thing = thingRepository.findById(123L);
// ...
}
public void doSomethingElse() {
Thing thing = new Thing();
thingRepository.save(thing);
// ...
}问题是所有这些查询都被发送到Aurora的Writer实例,而我的Reader实例仍未使用。
但我希望在集群中的所有实例之间实现findById、existsById、findAll等方法调用的负载均衡,并且只将save、saveAll、deleteById、deleteAll等操作发送到编写器实例。
有没有办法做到这一点?
发布于 2019-10-23 13:31:41
您可以做的是设置两个数据源,并使用不同的数据源创建不同的存储库。
但是,对于JPA,这种方法有一个问题:如果您读取一个实体并对其进行操作,它将被保存,这可能不会起作用,至少在原始读取转到read实例时是不需要的。
因此,为了防止这种情况,您必须在加载实体后将其分离,如果在分离之前没有确保完全加载实体,这反过来将导致LazyLoadingException。
发布于 2020-06-24 20:18:46
你试过使用Spring Cloud AWSData Access with JDBC#吗?
它提供了使用读复本配置连接到Aurora实例所需的全部内容
https://stackoverflow.com/questions/58515780
复制相似问题