Spring Data JPA: Как загрузить запросы чтения баланса между экземплярами RDS Aurora PostgreSQL? - PullRequest
0 голосов
/ 23 октября 2019

Я создал кластер Aurora PostgreSQL в AWS:

+ 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.
}

Аналогично, есть некоторые обычные READ / WRITEоперации:

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 для отправки в экземпляр Writer.

Есть ли способ сделать это?

1 Ответ

0 голосов
/ 23 октября 2019

Что вы можете сделать, это настроить два источника данных и создать разные репозитории, используя разные источники данных.

С JPA есть проблема, однако, с этим подходом: если вы читаете объект и манипулируете им, он будет сохранен, которыйвероятно, не будет работать и, по крайней мере, нежелательно, когда исходное чтение перешло к экземпляру read.

Так что, чтобы предотвратить это, вам нужно было бы отключить сущности после их загрузки, что, в свою очередь,приведет к LazyLoadingException, если вы не уверены, что полностью загружаете объекты перед отсоединением.

...