teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

文法の修正

2021/01/20 04:51

投稿

kukukuSZ
kukukuSZ

スコア0

title CHANGED
File without changes
body CHANGED
@@ -48,7 +48,7 @@
48
48
 
49
49
  @Transactional(readonly=true)
50
50
  public Object get() {
51
- return UserRepository.get();
51
+ return UserRepository.findAll();
52
52
  }
53
53
  }
54
54
 

4

文法の修正

2021/01/20 04:51

投稿

kukukuSZ
kukukuSZ

スコア0

title CHANGED
File without changes
body CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ```ここに言語を入力
10
10
  // コントローラクラス
11
- @Controller
11
+ @RestController
12
12
  public class TestController {
13
13
 
14
14
  @Autowired

3

試したことを追記

2021/01/20 02:24

投稿

kukukuSZ
kukukuSZ

スコア0

title CHANGED
File without changes
body CHANGED
@@ -80,11 +80,11 @@
80
80
 
81
81
  // スイッチするデータソースを設定
82
82
  Map<Object, Object> dataSources = new HashMap<>();
83
- dataSources.put(READ_ONLY_DATA_SOURCE_NAME, readableDataSource);
83
+ dataSources.put(READ_ONLY_DATA_SOURCE_NAME, DB2());
84
- dataSources.put(UPDATABLE_DATA_SOURCE_NAME, updatableDataSource);
84
+ dataSources.put(UPDATABLE_DATA_SOURCE_NAME, DB1());
85
85
 
86
86
  resolver.setTargetDataSources(dataSources);
87
- resolver.setDefaultTargetDataSource(updatableDataSource);
87
+ resolver.setDefaultTargetDataSource(dataSources.get("UPDATABLE_DATA_SOURCE_NAME"));
88
88
  return resolver;
89
89
  }
90
90
 

2

試したことを追記

2021/01/18 07:31

投稿

kukukuSZ
kukukuSZ

スコア0

title CHANGED
File without changes
body CHANGED
@@ -55,6 +55,7 @@
55
55
  ```
56
56
 
57
57
  ### 試したこと
58
+
58
59
  AbstractRoutingDataSourceを継承したクラスを作成、ThreadLocalを使用してcurrentLookupKeyを設定しました。
59
60
  @Aspectと専用のアノテーションを作成して、処理前にDataSourceを決定できるようにしました。
60
61
 
@@ -63,6 +64,80 @@
63
64
  ユーザサービスクラス内の@Transactionalの下に専用アノテーションを付与して、取得用DBを参照するようにしましたが、
64
65
  書込用DBから取得を行ってしまいます。
65
66
 
67
+ ② ※ 2021/1/18追記
68
+ transactionmanagerを複製して、@Transactionalのvalueに明示的に指定しましたが、デフォルトのDBにアクセスしてしまいます。
69
+
70
+ ```ここに言語を入力
71
+
72
+ // DB定義クラス
73
+ @configuration
74
+ public class DBconfig {
75
+ // ①用
76
+ @Bean
77
+ @Primary
78
+ public RoutingDataSourceResolver multiDataSource() {
79
+ RoutingDataSourceResolver resolver = new RoutingDataSourceResolver();
80
+
81
+ // スイッチするデータソースを設定
82
+ Map<Object, Object> dataSources = new HashMap<>();
83
+ dataSources.put(READ_ONLY_DATA_SOURCE_NAME, readableDataSource);
84
+ dataSources.put(UPDATABLE_DATA_SOURCE_NAME, updatableDataSource);
85
+
86
+ resolver.setTargetDataSources(dataSources);
87
+ resolver.setDefaultTargetDataSource(updatableDataSource);
88
+ return resolver;
89
+ }
90
+
91
+ public DataSource DB1() {
92
+ HikariDataSource dataSource = new HikariDataSource();
93
+ dataSource.setJdbcUrl(xxx1);
94
+ dataSource.setUsername(xxx);
95
+ dataSource.setPassword(xxx);
96
+ dataSource.setDriverClassName(xxx);
97
+ return dataSource;
98
+ }
99
+
100
+ public DataSource DB2() {
101
+ HikariDataSource dataSource = new HikariDataSource();
102
+ dataSource.setJdbcUrl(xxx2);
103
+ dataSource.setUsername(xxx);
104
+ dataSource.setPassword(xxx);
105
+ dataSource.setDriverClassName(xxx);
106
+ return dataSource;
107
+ }
108
+
109
+ // ②用 デフォルトは"transactionManager"を指定
110
+ @Bean(name = "transactionManager")
111
+ pubic PlatformTransactionManager create1() {
112
+ return new DataSourceTransactionManager(DB1());
113
+
114
+ @Bean(name = "transactionManagerForReplica")
115
+ pubic PlatformTransactionManager create2() {
116
+ return new DataSourceTransactionManager(DB2());
117
+
118
+ }
119
+
120
+ // サービスクラスでAutowired
121
+ @Service
122
+ public class UserServiceImpl implements UserService {
123
+
124
+ @Autowired
125
+ private UserRepository UserRepository;
126
+
127
+ @Qualifier("transactionManagerForReplica")
128
+ @Autowired
129
+ private PlatformTransactionManager transactionManagerForReplica;
130
+
131
+ @Transactional(readonly = true , value = "transactionManagerForReplica")
132
+ public Object get() {
133
+ return UserRepository.get();
134
+ }
135
+ }
136
+
137
+
138
+ ```
139
+
140
+
66
141
  ### 補足情報
67
142
 
68
143
  初めて書き込むこともあり、拙い日本語ですが、知見のある方ご教示いただけませんでしょうか。

1

コードの可読性

2021/01/18 07:29

投稿

kukukuSZ
kukukuSZ

スコア0

title CHANGED
File without changes
body CHANGED
@@ -1,5 +1,3 @@
1
- ### 前提・実現したいこと
2
-
3
1
  Spring内でJPARepositoryを用いて、1リクエスト内に複数DBからデータを取得および書込を行いたいです。
4
2
  具体的には、以下の通りです。
5
3
  データ書込用DBに履歴の保存を行い、データ取得用DBからユーザの取得をそれぞれ行う想定です。
@@ -8,6 +6,7 @@
8
6
 
9
7
  ### 該当のソースコード
10
8
 
9
+ ```ここに言語を入力
11
10
  // コントローラクラス
12
11
  @Controller
13
12
  public class TestController {
@@ -53,6 +52,7 @@
53
52
  }
54
53
  }
55
54
 
55
+ ```
56
56
 
57
57
  ### 試したこと
58
58
  AbstractRoutingDataSourceを継承したクラスを作成、ThreadLocalを使用してcurrentLookupKeyを設定しました。