2016-12-10 36 views
0

我的springboot應用程序嘗試從兩個數據源(emwbis和backupemwbis)讀取數據。我已經按照下面的鏈接配置我的springboot應用程序來從兩個不同的數據源讀取數據。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; 

DataSource配置類主要和備份數據源:

@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)。我想在控制器類中使用getByIdFromBackup方法讀取輔助數據庫(backupemwbis)中的數據。

有人可以讓我知道我的代碼中的錯誤嗎?或者你可以建議/指導我實現我的目標?

+0

請發佈您的entityManagerFactory配置。 –

+1

嗨,亞歷克斯,我把它們複製到這裏:pastebin.com/FmKKw81f – harshavmb

+0

嗨!一個問題:你需要創建兩個模型類和兩個存儲庫嗎?有一種方法可以在bean構建中配置這個回退功能嗎? – multiplayer1080

回答

1

從你創建一個名爲myDatasource和你是第二EMF的主要數據源bean定義的第一個配置文件注入相同的數據源參考。 豆引起的問題是這樣的

@Bean 
@Primary 
public DataSource myDataSource() 

只需更改第二Bean的數據源名稱,並在第二EMF使用它。

public class BackupCrsBISDatabaseConfig { 

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

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

希望這能解決它。

0

你必須明確地要求你@Transactional使用一個TransactionManager實現:

@Transactional("crsBISTransactionManager") 
//.. 

@Transactional("crsBISBackupTransactionManager") 
//.. 
+0

已經試過這個,它仍然在從主數據庫讀取.. :( – harshavmb

+0

可以請你分享entityManager-s和transactionManager-s的定義嗎? – dimitrisli

+0

實體和事務類在這裏: http://pastebin.com/FmKKw81f – harshavmb

相關問題