我的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类:
@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)读取数据。
有人可以告诉我代码中的错误吗?或者你可以建议/指导我实现我的目标?
答案 0 :(得分:1)
从第一个配置文件中创建名为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());
}
}
希望这可以解决它。
答案 1 :(得分:0)
您必须在TransactionManager
用法中明确请求@Transactional
实施:
@Transactional("crsBISTransactionManager")
//..
@Transactional("crsBISBackupTransactionManager")
//..