私は、異なる年の複数のデータベースを持つSpringブートプロジェクトを持っており、これらのデータベースは同じテーブルを持つので、唯一の違いは年(...、DB2016、DB2017)です。アプリケーションのコントローラでは、私は "異なる"年に属するデータを返す必要があります。さらに将来、他のデータベースも作成されます(たとえば、2018年には「DB2018」という名前のデータベースが存在します)。だから私の問題は、新しいデータソースと新しいリポジトリを毎年作成することなくデータベース間の接続を切り替える方法です。 私が投稿した別の質問(Spring Boot - Same repository and same entity for different databases)では、既存のデータベースごとに異なるデータソースと異なるリポジトリを作成するという回答がありましたが、この場合、現在のデータベースに基づいて現在の年のデータを返したいと考えています。より具体的には:Springブート - 接続を動的に変更します
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
現在の年が2017年であるのであれば、私はこのような何かしたい:
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;
ホープeverithingをここにおそらくあなたのニーズに最も適しているものは、SpringのAbstractRoutingDataSource
ある
ありがとうございました!最近の私は回避策を見つけましたが、私の解決策はオートワイヤリングの原則に従わないので、私はあなたのソリューションを試してみます – Mark