###前提
データベースが以下のようにA,Bの2つに分かれている
A : jdbc:postgresql://myhost:5432/sampleA B : jdbc:postgresql://myhost:5432/sampleB
2つのデータベースはテーブル構成等全て同一で、格納されるデータのみ差がある。
格納されるデータはランダムではなく、ある条件にしたがってAまたはBに振り分けされる
###実現したいこと
以下のようにController自身はあまりdatasorceを意識することなくRequestParam("ds")の値によって取得するデータを切り替えたいのですが、なかなか良い実装方法が思い浮かびません。
(a,bを動的に分けるのは比較的簡単なのですが、cをきれいにまとめるのが難しいです)
こういう構造を上手いこと吸収してくれる設計、クラス、OSS等ありませんでしょうか?
- aのとき : Aのデータ
- bのとき : Bのデータ
- cのとき : A,B両方のデータ
java
1@RestController 2@RequestMapping("user") 3public class UserController { 4 5 @Autowired 6 UserService userService; 7 8 @GetMapping("findall") 9 public List<User> findall(HttpServletRequest request, @RequestParam("ds") String ds){ 10 return userService.findAll(ds); 11 } 12}
###試したこと
現状以下のような抽象クラスをUserServiceImpl等の各Service実装クラスで継承することで実現できていますが、トランザクションをプログラマティックに管理したくないのと、各Service実装でデータのマージなどを行うコードが重複していて気持ち悪いです。
java
1public abstract class TransactionManagerServiceImpl { 2 3 @FunctionalInterface 4 protected interface Processor { 5 void process() throws Exception; 6 } 7 8 @Autowired 9 private ApplicationContext context; 10 11 protected void doProcess(DataNode dataNode, Processor processor) throws Exception { 12 13 PlatformTransactionManager txManager = 14 (PlatformTransactionManager) context.getBean(dataNode.getTransactionManagerName()); 15 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 16 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 17 TransactionStatus status = txManager.getTransaction(def); 18 19 try { 20 processor.process(); 21 } catch (Exception e) { 22 txManager.rollback(status); 23 throw e; 24 } 25 26 txManager.commit(status); 27 } 28 29}
###補足情報(言語/FW/ツール等のバージョンなど)
- データベースはPostgreSQLで変更ができない(構造も)。v9.5.4
- フレームワークはSpring(SpringBoot)。設計段階のためバージョンは選択できる
- 依存情報
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>

バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/12/13 05:23 編集