当前位置: 首页 > 知识库问答 >
问题:

springboot始终从主数据源读取数据

诸新霁
2023-03-14

我的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);
}

持久db proeprties文件:

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)。我需要controller类中的getByIdFromBackup方法从辅助数据库(backupemwbis)读取数据。

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

共有2个答案

彭烨熠
2023-03-14

您必须在事务性用法中明确请求TransactionManager实现:

@Transactional("crsBISTransactionManager")
//..

@Transactional("crsBISBackupTransactionManager")
//..
公良鸿风
2023-03-14

从第一个配置文件创建一个名为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());
    }
}

希望这能修复它。

 类似资料:
  • 介绍 有时候,浏览器会通过post发送很多数据。在webpy,你可以这样操作。 代码 class RequestHandler(object): def POST(self): data = web.data() # 通过这个方法可以取到数据

  • 下面的json数据示例 下面的错误消息 线程“main”org.apache.spark.sql.analysisException中出现异常:未能找到数据源:Kafka。请按照“结构化流+Kafka集成指南”的部署部分部署应用程序。;在org.apache.spark.sql.execution.datasources.datasource$.lookupdatasource(datasourc

  • 我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。

  • 我正在读取火基数据库的数据。以下是存储在数据库中的数据的快照。 在以“8SS...”开头的快照字符串中,是用户的 uid。以下是用于从 firebase 数据库中检索数据的代码。 用户类包含getter和setters。 错误是只有结论。 如何评估 从值事件中读取时的错误是什么? 我尝试使用这个: 然后调用<code>ref。addListenerForSingleValueEvent()但仍然没

  • 问题内容: 当我尝试使用时会发生异常: 也不显示主键。 问题答案: 对于Access ODBC,我们可以通过pyodbc对象的方法获取“主键”列:

  • 我正在尝试访问Datasource对象,但它总是给出null,我正在使用@Inject,请告诉我我做错了什么? 它总是给空AgroalDataSource广告对象,为什么它不工作,我做错了什么吗? 它给出了以下错误: 2021-02-23 18:23:08,029ERROR[systemLogger](Quarkus主线程)DataSource不能为空:java.lang.IllegalArgum