Ich habe ein Spring Boot-Projekt mit mehreren Datenbanken aus verschiedenen Jahren und diese Datenbanken haben die gleichen Tabellen, so dass der einzige Unterschied ist das Jahr (..., DB2016, DB2017). Im Controller der Anwendung muss ich Daten zurückgeben, die zu "unterschiedlichen" Jahren gehören. Außerdem werden in den nächsten Jahren weitere Datenbanken erstellt (zB 2018 wird es eine Datenbank namens "DB2018" geben). Mein Problem ist also, wie man die Verbindung zwischen den Datenbanken wechselt, ohne jedes Jahr eine neue Datenquelle und ein neues Repository zu erstellen. In einer anderen Frage von mir (Spring Boot - Same repository and same entity for different databases) war die Antwort zu verschiedenen Datenquellen und verschiedenen Repositories für jede vorhandene Datenbank zu erstellen, aber in diesem Fall möchte ich Daten aus vorhandenen Datenbanken auf der Grundlage des aktuellen Jahres zurückgeben. Insbesondere:Spring Boot - Ändern der Verbindung dynamisch
SomeEntity.java
@Entity(name = "SOMETABLE")
public class SomeEntity implements Serializable {
@Id
@Column(name="ID", nullable=false)
private Integer id;
@Column(name="NAME")
private String name;
}
SomeRepository.java
public interface SomeRepository extends PagingAndSortingRepository<SomeEntity, Integer> {
@Query(nativeQuery= true, value = "SELECT * FROM SOMETABLE WHERE NAME = ?1")
List<SomeEntity> findByName(String name);
}
SomeController.java
@RequestMapping(value="/foo/{name}", method=RequestMethod.GET)
public ResponseEntity<List<SomeEntity>> findByName(@PathVariable("name") String name) {
List<SomeEntity> list = autowiredRepo.findByName(name);
return new ResponseEntity<List<SomeEntity>>(list,HttpStatus.OK);
}
application.properties
spring.datasource.url=jdbc:postgresql://localhost:5432/DB
spring.datasource.username=xxx
spring.datasource.password=xxx
So
wenn das aktuelle Jahr 2017 ist möchte ich etwas wie folgt aus:
int currentyear = Calendar.getInstance().get(Calendar.YEAR);
int oldestDbYear = 2014;
List<SomeEntity> listToReturn = new LinkedList<SomeEntity>();
//the method getProperties is a custom method to get properties from a file
String url = getProperties("application.properties", "spring.datasource.url");
props.setProperty("user", getProperties("application.properties","spring.datasource.username"));
props.setProperty("password", getProperties("application.properties","spring.datasource.password"));
for (int i = currentYear, i>oldestDbYear, i--) {
//this is the connection that must be used by autowiredRepo Repository, but i don't know how to do this.
//So the repository uses different connection for every year.
Connection conn = getConnection(url+year,props);
List<SomeEntity> list_of_specific_year = autowiredRepo.findByName(name);
conn.close;
listToReturn.addAll(list_of_specific_year);
}
return listToReturn;
Hoffnung everithing ist klar
Vielen Dank! In diesen Tagen fand ich einen Workaround, aber meine Lösung folgt nicht dem Prinzip des Autowiderlaufs, also werde ich mit Ihrer Lösung versuchen – Mark