質問編集履歴

5

文法の修正

2021/01/20 04:51

投稿

kukukuSZ
kukukuSZ

スコア0

test CHANGED
File without changes
test CHANGED
@@ -98,6 +98,170 @@
98
98
 
99
99
  public Object get() {
100
100
 
101
+ return UserRepository.findAll();
102
+
103
+ }
104
+
105
+ }
106
+
107
+
108
+
109
+ ```
110
+
111
+
112
+
113
+ ### 試したこと
114
+
115
+
116
+
117
+ AbstractRoutingDataSourceを継承したクラスを作成、ThreadLocalを使用してcurrentLookupKeyを設定しました。
118
+
119
+ @Aspectと専用のアノテーションを作成して、処理前にDataSourceを決定できるようにしました。
120
+
121
+
122
+
123
+ 参考:) https://monakaice88.hatenablog.com/entry/2018/07/28/172720
124
+
125
+
126
+
127
+ ユーザサービスクラス内の@Transactionalの下に専用アノテーションを付与して、取得用DBを参照するようにしましたが、
128
+
129
+ 書込用DBから取得を行ってしまいます。
130
+
131
+
132
+
133
+ ② ※ 2021/1/18追記
134
+
135
+ transactionmanagerを複製して、@Transactionalのvalueに明示的に指定しましたが、デフォルトのDBにアクセスしてしまいます。
136
+
137
+
138
+
139
+ ```ここに言語を入力
140
+
141
+
142
+
143
+ // DB定義クラス
144
+
145
+ @configuration
146
+
147
+ public class DBconfig {
148
+
149
+ // ①用
150
+
151
+ @Bean
152
+
153
+ @Primary
154
+
155
+ public RoutingDataSourceResolver multiDataSource() {
156
+
157
+ RoutingDataSourceResolver resolver = new RoutingDataSourceResolver();
158
+
159
+
160
+
161
+ // スイッチするデータソースを設定
162
+
163
+ Map<Object, Object> dataSources = new HashMap<>();
164
+
165
+ dataSources.put(READ_ONLY_DATA_SOURCE_NAME, DB2());
166
+
167
+ dataSources.put(UPDATABLE_DATA_SOURCE_NAME, DB1());
168
+
169
+
170
+
171
+ resolver.setTargetDataSources(dataSources);
172
+
173
+ resolver.setDefaultTargetDataSource(dataSources.get("UPDATABLE_DATA_SOURCE_NAME"));
174
+
175
+ return resolver;
176
+
177
+ }
178
+
179
+
180
+
181
+ public DataSource DB1() {
182
+
183
+ HikariDataSource dataSource = new HikariDataSource();
184
+
185
+ dataSource.setJdbcUrl(xxx1);
186
+
187
+ dataSource.setUsername(xxx);
188
+
189
+ dataSource.setPassword(xxx);
190
+
191
+ dataSource.setDriverClassName(xxx);
192
+
193
+ return dataSource;
194
+
195
+ }
196
+
197
+
198
+
199
+ public DataSource DB2() {
200
+
201
+ HikariDataSource dataSource = new HikariDataSource();
202
+
203
+ dataSource.setJdbcUrl(xxx2);
204
+
205
+ dataSource.setUsername(xxx);
206
+
207
+ dataSource.setPassword(xxx);
208
+
209
+ dataSource.setDriverClassName(xxx);
210
+
211
+ return dataSource;
212
+
213
+ }
214
+
215
+
216
+
217
+ // ②用 デフォルトは"transactionManager"を指定
218
+
219
+ @Bean(name = "transactionManager")
220
+
221
+ pubic PlatformTransactionManager create1() {
222
+
223
+ return new DataSourceTransactionManager(DB1());
224
+
225
+
226
+
227
+ @Bean(name = "transactionManagerForReplica")
228
+
229
+ pubic PlatformTransactionManager create2() {
230
+
231
+ return new DataSourceTransactionManager(DB2());
232
+
233
+
234
+
235
+ }
236
+
237
+
238
+
239
+ // サービスクラスでAutowired
240
+
241
+ @Service
242
+
243
+ public class UserServiceImpl implements UserService {
244
+
245
+
246
+
247
+ @Autowired
248
+
249
+ private UserRepository UserRepository;
250
+
251
+
252
+
253
+ @Qualifier("transactionManagerForReplica")
254
+
255
+ @Autowired
256
+
257
+ private PlatformTransactionManager transactionManagerForReplica;
258
+
259
+
260
+
261
+ @Transactional(readonly = true , value = "transactionManagerForReplica")
262
+
263
+ public Object get() {
264
+
101
265
  return UserRepository.get();
102
266
 
103
267
  }
@@ -106,176 +270,12 @@
106
270
 
107
271
 
108
272
 
273
+
274
+
109
275
  ```
110
276
 
111
277
 
112
278
 
113
- ### 試したこと
114
-
115
-
116
-
117
- AbstractRoutingDataSourceを継承したクラスを作成、ThreadLocalを使用してcurrentLookupKeyを設定しました。
118
-
119
- @Aspectと専用のアノテーションを作成して、処理前にDataSourceを決定できるようにしました。
120
-
121
-
122
-
123
- 参考:) https://monakaice88.hatenablog.com/entry/2018/07/28/172720
124
-
125
-
126
-
127
- ユーザサービスクラス内の@Transactionalの下に専用アノテーションを付与して、取得用DBを参照するようにしましたが、
128
-
129
- 書込用DBから取得を行ってしまいます。
130
-
131
-
132
-
133
- ② ※ 2021/1/18追記
134
-
135
- transactionmanagerを複製して、@Transactionalのvalueに明示的に指定しましたが、デフォルトのDBにアクセスしてしまいます。
136
-
137
-
138
-
139
- ```ここに言語を入力
140
-
141
-
142
-
143
- // DB定義クラス
144
-
145
- @configuration
146
-
147
- public class DBconfig {
148
-
149
- // ①用
150
-
151
- @Bean
152
-
153
- @Primary
154
-
155
- public RoutingDataSourceResolver multiDataSource() {
156
-
157
- RoutingDataSourceResolver resolver = new RoutingDataSourceResolver();
158
-
159
-
160
-
161
- // スイッチするデータソースを設定
162
-
163
- Map<Object, Object> dataSources = new HashMap<>();
164
-
165
- dataSources.put(READ_ONLY_DATA_SOURCE_NAME, DB2());
166
-
167
- dataSources.put(UPDATABLE_DATA_SOURCE_NAME, DB1());
168
-
169
-
170
-
171
- resolver.setTargetDataSources(dataSources);
172
-
173
- resolver.setDefaultTargetDataSource(dataSources.get("UPDATABLE_DATA_SOURCE_NAME"));
174
-
175
- return resolver;
176
-
177
- }
178
-
179
-
180
-
181
- public DataSource DB1() {
182
-
183
- HikariDataSource dataSource = new HikariDataSource();
184
-
185
- dataSource.setJdbcUrl(xxx1);
186
-
187
- dataSource.setUsername(xxx);
188
-
189
- dataSource.setPassword(xxx);
190
-
191
- dataSource.setDriverClassName(xxx);
192
-
193
- return dataSource;
194
-
195
- }
196
-
197
-
198
-
199
- public DataSource DB2() {
200
-
201
- HikariDataSource dataSource = new HikariDataSource();
202
-
203
- dataSource.setJdbcUrl(xxx2);
204
-
205
- dataSource.setUsername(xxx);
206
-
207
- dataSource.setPassword(xxx);
208
-
209
- dataSource.setDriverClassName(xxx);
210
-
211
- return dataSource;
212
-
213
- }
214
-
215
-
216
-
217
- // ②用 デフォルトは"transactionManager"を指定
218
-
219
- @Bean(name = "transactionManager")
220
-
221
- pubic PlatformTransactionManager create1() {
222
-
223
- return new DataSourceTransactionManager(DB1());
224
-
225
-
226
-
227
- @Bean(name = "transactionManagerForReplica")
228
-
229
- pubic PlatformTransactionManager create2() {
230
-
231
- return new DataSourceTransactionManager(DB2());
232
-
233
-
234
-
235
- }
236
-
237
-
238
-
239
- // サービスクラスでAutowired
240
-
241
- @Service
242
-
243
- public class UserServiceImpl implements UserService {
244
-
245
-
246
-
247
- @Autowired
248
-
249
- private UserRepository UserRepository;
250
-
251
-
252
-
253
- @Qualifier("transactionManagerForReplica")
254
-
255
- @Autowired
256
-
257
- private PlatformTransactionManager transactionManagerForReplica;
258
-
259
-
260
-
261
- @Transactional(readonly = true , value = "transactionManagerForReplica")
262
-
263
- public Object get() {
264
-
265
- return UserRepository.get();
266
-
267
- }
268
-
269
- }
270
-
271
-
272
-
273
-
274
-
275
- ```
276
-
277
-
278
-
279
279
 
280
280
 
281
281
  ### 補足情報

4

文法の修正

2021/01/20 04:51

投稿

kukukuSZ
kukukuSZ

スコア0

test CHANGED
File without changes
test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  // コントローラクラス
20
20
 
21
- @Controller
21
+ @RestController
22
22
 
23
23
  public class TestController {
24
24
 

3

試したことを追記

2021/01/20 02:24

投稿

kukukuSZ
kukukuSZ

スコア0

test CHANGED
File without changes
test CHANGED
@@ -162,15 +162,15 @@
162
162
 
163
163
  Map<Object, Object> dataSources = new HashMap<>();
164
164
 
165
- dataSources.put(READ_ONLY_DATA_SOURCE_NAME, readableDataSource);
165
+ dataSources.put(READ_ONLY_DATA_SOURCE_NAME, DB2());
166
-
166
+
167
- dataSources.put(UPDATABLE_DATA_SOURCE_NAME, updatableDataSource);
167
+ dataSources.put(UPDATABLE_DATA_SOURCE_NAME, DB1());
168
168
 
169
169
 
170
170
 
171
171
  resolver.setTargetDataSources(dataSources);
172
172
 
173
- resolver.setDefaultTargetDataSource(updatableDataSource);
173
+ resolver.setDefaultTargetDataSource(dataSources.get("UPDATABLE_DATA_SOURCE_NAME"));
174
174
 
175
175
  return resolver;
176
176
 

2

試したことを追記

2021/01/18 07:31

投稿

kukukuSZ
kukukuSZ

スコア0

test CHANGED
File without changes
test CHANGED
@@ -112,6 +112,8 @@
112
112
 
113
113
  ### 試したこと
114
114
 
115
+
116
+
115
117
  AbstractRoutingDataSourceを継承したクラスを作成、ThreadLocalを使用してcurrentLookupKeyを設定しました。
116
118
 
117
119
  @Aspectと専用のアノテーションを作成して、処理前にDataSourceを決定できるようにしました。
@@ -128,6 +130,154 @@
128
130
 
129
131
 
130
132
 
133
+ ② ※ 2021/1/18追記
134
+
135
+ transactionmanagerを複製して、@Transactionalのvalueに明示的に指定しましたが、デフォルトのDBにアクセスしてしまいます。
136
+
137
+
138
+
139
+ ```ここに言語を入力
140
+
141
+
142
+
143
+ // DB定義クラス
144
+
145
+ @configuration
146
+
147
+ public class DBconfig {
148
+
149
+ // ①用
150
+
151
+ @Bean
152
+
153
+ @Primary
154
+
155
+ public RoutingDataSourceResolver multiDataSource() {
156
+
157
+ RoutingDataSourceResolver resolver = new RoutingDataSourceResolver();
158
+
159
+
160
+
161
+ // スイッチするデータソースを設定
162
+
163
+ Map<Object, Object> dataSources = new HashMap<>();
164
+
165
+ dataSources.put(READ_ONLY_DATA_SOURCE_NAME, readableDataSource);
166
+
167
+ dataSources.put(UPDATABLE_DATA_SOURCE_NAME, updatableDataSource);
168
+
169
+
170
+
171
+ resolver.setTargetDataSources(dataSources);
172
+
173
+ resolver.setDefaultTargetDataSource(updatableDataSource);
174
+
175
+ return resolver;
176
+
177
+ }
178
+
179
+
180
+
181
+ public DataSource DB1() {
182
+
183
+ HikariDataSource dataSource = new HikariDataSource();
184
+
185
+ dataSource.setJdbcUrl(xxx1);
186
+
187
+ dataSource.setUsername(xxx);
188
+
189
+ dataSource.setPassword(xxx);
190
+
191
+ dataSource.setDriverClassName(xxx);
192
+
193
+ return dataSource;
194
+
195
+ }
196
+
197
+
198
+
199
+ public DataSource DB2() {
200
+
201
+ HikariDataSource dataSource = new HikariDataSource();
202
+
203
+ dataSource.setJdbcUrl(xxx2);
204
+
205
+ dataSource.setUsername(xxx);
206
+
207
+ dataSource.setPassword(xxx);
208
+
209
+ dataSource.setDriverClassName(xxx);
210
+
211
+ return dataSource;
212
+
213
+ }
214
+
215
+
216
+
217
+ // ②用 デフォルトは"transactionManager"を指定
218
+
219
+ @Bean(name = "transactionManager")
220
+
221
+ pubic PlatformTransactionManager create1() {
222
+
223
+ return new DataSourceTransactionManager(DB1());
224
+
225
+
226
+
227
+ @Bean(name = "transactionManagerForReplica")
228
+
229
+ pubic PlatformTransactionManager create2() {
230
+
231
+ return new DataSourceTransactionManager(DB2());
232
+
233
+
234
+
235
+ }
236
+
237
+
238
+
239
+ // サービスクラスでAutowired
240
+
241
+ @Service
242
+
243
+ public class UserServiceImpl implements UserService {
244
+
245
+
246
+
247
+ @Autowired
248
+
249
+ private UserRepository UserRepository;
250
+
251
+
252
+
253
+ @Qualifier("transactionManagerForReplica")
254
+
255
+ @Autowired
256
+
257
+ private PlatformTransactionManager transactionManagerForReplica;
258
+
259
+
260
+
261
+ @Transactional(readonly = true , value = "transactionManagerForReplica")
262
+
263
+ public Object get() {
264
+
265
+ return UserRepository.get();
266
+
267
+ }
268
+
269
+ }
270
+
271
+
272
+
273
+
274
+
275
+ ```
276
+
277
+
278
+
279
+
280
+
131
281
  ### 補足情報
132
282
 
133
283
 

1

コードの可読性

2021/01/18 07:29

投稿

kukukuSZ
kukukuSZ

スコア0

test CHANGED
File without changes
test CHANGED
@@ -1,7 +1,3 @@
1
- ### 前提・実現したいこと
2
-
3
-
4
-
5
1
  Spring内でJPARepositoryを用いて、1リクエスト内に複数DBからデータを取得および書込を行いたいです。
6
2
 
7
3
  具体的には、以下の通りです。
@@ -17,6 +13,8 @@
17
13
  ### 該当のソースコード
18
14
 
19
15
 
16
+
17
+ ```ここに言語を入力
20
18
 
21
19
  // コントローラクラス
22
20
 
@@ -108,6 +106,8 @@
108
106
 
109
107
 
110
108
 
109
+ ```
110
+
111
111
 
112
112
 
113
113
  ### 試したこと