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

标签 java spring spring-boot spring-data-jpa spring-data

这可以做到吗?

我只找到了他们创建多个存储库和多个实体类来执行此操作的来源。但是,我找不到任何来源表明您可以让 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/

相关文章:

java - 静态资源+web-inf+Spring Boot

java - SolrHealthIndicator 不带已弃用的 CompositeHealthIndicator

java - Spring @transactional与MongoDB一起工作吗?

spring - 如何使用 WebApplicationInitializer 配置 @EnableConfigurationProperties、@ConfigurationProperties?

java - WCF 客户端禁用加密

java - 我如何使用 ant <exec> 在 linux 上执行命令?

java - 将 while 循环嵌套在 do while 循环内

spring - 查询创建方法给出错误

java - 从 spring application.properties 禁用监听兔子队列

java - Windows JVM 命令行参数上的尾随星号在 cygwin bash shell 中被通配