2016-12-10 5 views
0

Meine Springboot App versucht, Daten von zwei Datenquellen (emwbis und backupemwbis) zu lesen. Ich habe den folgenden Link bei der Konfiguration meiner Springboot-App verwendet, um Daten aus zwei verschiedenen Datenquellen zu lesen.Springboot liest immer Daten von primären Datenquelle

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

Das aktuelle Problem mit meiner app ist es immer Daten aus der primären Datenquelle zu lesen ist (emwbis). Ich habe den folgenden Code geschrieben.

Modellklassen für primäre und Backup-Datenquellen:

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; 

Datenquelle Konfigurationsklassen für primäre und Backup-Datenquellen:

@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 { 

Repository-Schnittstellen für die primären und Backup-Datenquellen:

@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); 
} 

Persistente db-Properties-Datei:

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-Klasse sowohl die Datenquellen zu testen:

@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; 
    } 

Obwohl ich die Datenbankschemata in den Modellklassen und in der Datenbank-Konfigurationsdatei getrennt habe, sowohl die Methoden in dem Controller-Klasse-Hit die gleiche Datenbank (emwbis). Ich möchte getByIdFromBackup Methode in der Controller-Klasse, um die Daten aus der sekundären Datenbank (backupemwbis) zu lesen.

Kann mir bitte jemand den Fehler in meinem Code mitteilen? Oder Sie können mir vorschlagen/leiten, um mein Ziel zu erreichen?

+0

Bitte veröffentlichen Sie Ihre EntityManagerFactory-Konfigurationen. –

+1

Hallo Alex, ich habe sie hier kopiert: pastebin.com/FmKKw81f – harshavmb

+0

Hallo! Eine Frage: Müssen Sie zwei Modellklassen und zwei Repositories erstellen? Es gibt eine Möglichkeit, diesen Fallback in Bohnen zu konfigurieren? ? – multiplayer1080

Antwort

1

Von der ersten Konfigurationsdatei sind Sie eine primäre Datenquelle Bean Definition mit dem Namen MyDatasource und in der zweiten emf zu schaffen, du bist dieselbe Datenquellenreferenz eingibt. Die Bean das Problem verursacht, ist dies

@Bean 
@Primary 
public DataSource myDataSource() 

einfach den zweiten Namen Bean-Datenquelle ändern und es in der zweiten EMF verwenden.

public class BackupCrsBISDatabaseConfig { 

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

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

Hoffe das behebt es.

0

Sie müssen explizit anfordern eine TransactionManager Implementierung in Ihrer @Transactional Nutzung:

@Transactional("crsBISTransactionManager") 
//.. 

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

haben versucht, diese und es ist nach wie vor von der primären Datenbank zu lesen .. :( – harshavmb

+0

können Sie bitte die EntityManager-s und transaction-s Definitionen – dimitrisli

+0

Einheit und Transaktionsklassen teilen sind hier: http://pastebin.com/FmKKw81f – harshavmb

Verwandte Themen