gpt4 book ai didi

java - 配置 Spring Data Repository 类以针对读取/选择方法命中 read_replica_db 并针对写入/插入方法命中 main_db ?

转载 作者:行者123 更新时间:2023-12-02 01:09:09 26 4
gpt4 key购买 nike

这可以做到吗?

我只找到了他们创建多个存储库和多个实体类来执行此操作的来源。但是,我找不到任何来源表明您可以让 1 个 Repository 类访问不同的数据库。

基本上,我有一个具有读写方法的 DAO 类。我为其配置了一个 Spring 数据存储库,并且我正在尝试对其进行设置,以便读取类命中副本数据库,而写入类命中主数据库。

到目前为止,我一直在尝试为每个数据库定义两个不同的 SpringDataConfig 类。就像这样:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = { "repo" },
entityManagerFactoryRef = "Write",
transactionManagerRef = "JpaTxnManager_Write")
public class RepositoryConfigSpringDataDbWrite {
}

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = { "repo" },
entityManagerFactoryRef = "Read",
transactionManagerRef = "JpaTxnManager_Read")
public class RepositoryConfigSpringDataDbRead {
}

我们将 SpringDataRepository 类称为 EntityRepo。现在,在 DAO 类中,我尝试使用 @Transactional注释将特定方法指向特定数据库,如下所示:

@Transactional(transactionManager="JpaTxnManager_Read")
public List<Entity> getAllEntitiesById(String id) {
return entityRepo.findById(id);
}

其他一些调用 Write 的方法是:

@Transactional(transactionManager="JpaTxnManager_Write")
public List<Entity> getAllEntitiesById(Entity entity) {
return entityRepo.save(entity);
}

知道这是否可能吗?

最佳答案

您可以创建两个 Bean,通过单独的包扩展单个 Jpa 接口(interface)来执行两种行为,而不是尝试强制使用一个 Bean 来执行两种可能冲突的行为。这确保了即使开发人员忘记了 future Dao 方法中的注释,您的 Dao 中也会明确请求只读或写入存储库。

原始 JPA 存储库:

public interface EntityRepository extends CrudRepository<Entity, Long> { }

将数据库配置重新配置为 repo.readonly 和 repo.write

在 repo.readonly 中:

public interface EntityReadOnlyRepository extends EntityRepository { }

在 repo.write 中:

public interface EntityWriteRepository extends EntityRepository { }

然后,您可以将两个存储库及其各自的配置自动连接到您的服务中。

@Autowired
EntityReadOnlyRepository entityReadOnlyRepository;

@Autowired
EntityWriteRepository entityWriteRepository;

我假设您有只读数据锁以防止写入,但您也可以执行自定义 Impl 行为以在读取接口(interface)中抛出保存调用的异常。

关于java - 配置 Spring Data Repository 类以针对读取/选择方法命中 read_replica_db 并针对写入/插入方法命中 main_db ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59617208/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com