【问题标题】:springboot always read data from primary datasourcespringboot 总是从主数据源读取数据
【发布时间】:2017-04-25 21:59:52
【问题描述】:

我的 springboot 应用程序尝试从两个数据源(emwbis 和 backupemwbis)读取数据。我按照以下链接配置我的 springboot 应用程序以从两个不同的数据源读取数据。

http://www.baeldung.com/spring-data-jpa-multiple-databases

我的应用程序当前的问题是它总是从主数据源(emwbis)读取数据。我写了下面的代码。

主数据源和备份数据源的模型类:

package com.jl.models.primary;
@Entity
@Table(name = "crsbis",schema="emwbis")
@Data
public class CrsBIS {

    @Id
    private String id;

    @NotNull
    private String email;

package com.jl.models.backup;

import lombok.Data;

@Entity
@Table(name = "crsbis",schema="backupemwbis")
@Data
public class CrsBIS {

    @Id
    private String id;

    @NotNull
    private String email;

主数据源和备份数据源的数据源配置类:

@Configuration
@PropertySource("classpath:persistence-multiple-db.properties")
@EnableJpaRepositories(basePackages = "com.jl.dao.backup", entityManagerFactoryRef = "crsBISBackUpEntityManager", transactionManagerRef = "crsBISBackupTransactionManager")
public class BackupCrsBISDatabaseConfig {

@Configuration
@PropertySource("classpath:persistence-multiple-db.properties")
@EnableJpaRepositories(basePackages = "com.jl.dao.primary", entityManagerFactoryRef = "crsBISEntityManager", transactionManagerRef = "crsBISTransactionManager")
public class CrsBISDatabaseConfig {

主要和备份数据源的存储库接口:

@Transactional
public interface CrsBISRepository extends JpaRepository<CrsBIS, String> {
    public CrsBIS findById(String id);

}

@Transactional
public interface CrBisBackupRepository extends JpaRepository<CrsBIS, String>{
    public CrsBIS findById(String id);
}

持久化数据库属性文件:

jdbc.driverClassName=com.mysql.jdbc.Driver
crsbis.jdbc.url=jdbc:mysql://localhost:3306/emwbis
backupcrsbis.jdbc.url=jdbc:mysql://localhost:3306/backupemwbis
jdbc.user=root
jdbc.pass=Password1

用于测试两个数据源的控制器类:

@Controller
public class CrsBISController {

    @Autowired
    private CrsBISRepository crsBISRepository;

    @Autowired
    private CrBisBackupRepository crsBackupRepository;

@RequestMapping("/get-by-id")
    @ResponseBody
    public String getById(String id){
        String email="";
        try{
            CrsBIS crsBIS = crsBISRepository.findById(id);
            email = String.valueOf(crsBIS.getEmail());
        }catch (Exception e) {
            e.printStackTrace();
            return "id not found!";
        }
        return "The email is : "+email;
    }

    @RequestMapping("/get-by-id-backup")
    @ResponseBody
    public String getByIdFromBackup(String id){
        String email="";
        try{
            com.jl.models.backup.CrsBIS crsBIS = crsBackupRepository.findById(id);
            email = String.valueOf(crsBIS.getEmail());
        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            return "id not found!";
        }
        return "The email is : "+email;
    }

虽然我已经在模型类和数据库配置文件中分离了数据库模式,但控制器类中的两个方法都访问了同一个数据库 (emwbis)。我希望控制器类中的getByIdFromBackup 方法从辅助数据库(backupemwbis)中读取数据。

有人可以告诉我代码中的错误吗?或者您可以建议/指导我实现我的目标?

【问题讨论】:

  • 请发布您的 entityManagerFactory 配置。
  • 嗨,Alex,我在这里复制了它们:pastebin.com/FmKKw81f
  • 嗨!一个问题:您需要创建两个模型类和两个存储库吗?有一种方法可以在 bean 构建中配置这个后备?

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


【解决方案1】:

您必须在 @Transactional 用法中明确请求 TransactionManager 实现:

@Transactional("crsBISTransactionManager")
//..

@Transactional("crsBISBackupTransactionManager")
//..

【讨论】:

  • 已经尝试过了,它仍在从主数据库读取.. :(
  • 能否分享 entityManager-s 和 transactionManager-s 的定义?
  • 实体和事务类在这里:pastebin.com/FmKKw81f
【解决方案2】:

从第一个配置文件中,您将创建一个名为 myDatasource 的主数据源 bean 定义,并在第二个 emf 中注入相同的数据源引用。 导致问题的 Bean 是这样的

@Bean
@Primary
public DataSource myDataSource()

只需更改第二个 Bean 数据源名称并在第二个 EMF 中使用它。

public class BackupCrsBISDatabaseConfig {

    ...
    @Bean
    public DataSource backupDS() {
    ....

    @Bean
    public LocalContainerEntityManagerFactoryBean crsBISBackUpEntityManager() {
      ....
      em.setDataSource(backupDS());
    }
}

希望这能解决它。

【讨论】:

    猜你喜欢
    • 2020-04-24
    • 2020-11-10
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多