回答編集履歴

2

追記

2021/01/18 23:09

投稿

umau
umau

スコア805

test CHANGED
@@ -83,3 +83,201 @@
83
83
  ```
84
84
 
85
85
  [Spring - データアクセス リファレンスドキュメント](https://spring.pleiades.io/spring-framework/docs/current/reference/html/data-access.html)
86
+
87
+
88
+
89
+ (追記)
90
+
91
+ 「spring.jpa.open-in-view」をfalseにしたら切り替わりました。以下、動いたソースです。
92
+
93
+ ```YAML
94
+
95
+ spring:
96
+
97
+ datasource:
98
+
99
+ db1:
100
+
101
+ jdbc-url: jdbc:h2:./h2db/db1
102
+
103
+ username: dev
104
+
105
+ password: dev
106
+
107
+ driverClassName: org.h2.Driver
108
+
109
+
110
+
111
+ db2:
112
+
113
+ jdbc-url: jdbc:h2:./h2db/db2
114
+
115
+ username: dev
116
+
117
+ password: dev
118
+
119
+ driverClassName: org.h2.Driver
120
+
121
+ jpa:
122
+
123
+ open-in-view: false # <--コレ
124
+
125
+ hibernate:
126
+
127
+ ddl-auto: none
128
+
129
+ ```
130
+
131
+
132
+
133
+ ```java
134
+
135
+ @EnableWebMvc
136
+
137
+ @Configuration
138
+
139
+ public class WebConfig implements WebMvcConfigurer {
140
+
141
+
142
+
143
+ @Bean
144
+
145
+ @Primary
146
+
147
+ public RoutingDataSourceResolver multiDataSource() {
148
+
149
+ RoutingDataSourceResolver resolver = new RoutingDataSourceResolver();
150
+
151
+ Map<Object, Object> dataSources = new HashMap<>();
152
+
153
+ dataSources.put(DataSourceType.db1.name(), db1());
154
+
155
+ dataSources.put(DataSourceType.db2.name(), db2());
156
+
157
+
158
+
159
+ resolver.setTargetDataSources(dataSources);
160
+
161
+ resolver.setDefaultTargetDataSource(db1());
162
+
163
+ return resolver;
164
+
165
+ }
166
+
167
+
168
+
169
+ @Bean
170
+
171
+ @ConfigurationProperties(prefix = "spring.datasource.db1")
172
+
173
+ public DataSource db1() {
174
+
175
+ return DataSourceBuilder.create().build();
176
+
177
+ }
178
+
179
+
180
+
181
+ @Bean
182
+
183
+ @ConfigurationProperties(prefix = "spring.datasource.db2")
184
+
185
+ public DataSource db2() {
186
+
187
+ return DataSourceBuilder.create().build();
188
+
189
+ }
190
+
191
+ }
192
+
193
+ ```
194
+
195
+ ```java
196
+
197
+ public class DbContextHolder {
198
+
199
+
200
+
201
+ public enum DataSourceType {
202
+
203
+ db1, db2,
204
+
205
+ }
206
+
207
+
208
+
209
+ private static ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<>();
210
+
211
+
212
+
213
+ public static void setDataSourceType(DataSourceType type) {
214
+
215
+ contextHolder.set(type);
216
+
217
+ }
218
+
219
+
220
+
221
+ public static DataSourceType getDataSourceType() {
222
+
223
+ return contextHolder.get();
224
+
225
+ }
226
+
227
+
228
+
229
+ public static void clear() {
230
+
231
+ contextHolder.remove();
232
+
233
+ }
234
+
235
+ }
236
+
237
+ ```
238
+
239
+ ```java
240
+
241
+ @Controller
242
+
243
+ public class TestController {
244
+
245
+
246
+
247
+ @Autowired
248
+
249
+ Db1Service service1;
250
+
251
+
252
+
253
+ @Autowired
254
+
255
+ Db2Service service2;
256
+
257
+
258
+
259
+ @RequestMapping("/test")
260
+
261
+ public Object test() {
262
+
263
+
264
+
265
+ DbContextHolder.setDataSourceType(DataSourceType.db1);
266
+
267
+ List<Product> db1List = service1.get();
268
+
269
+
270
+
271
+ DbContextHolder.setDataSourceType(DataSourceType.db2);
272
+
273
+ List<Product> db2List = service2.get();
274
+
275
+
276
+
277
+ return "OK";
278
+
279
+ }
280
+
281
+ }
282
+
283
+ ```

1

追記

2021/01/18 23:09

投稿

umau
umau

スコア805

test CHANGED
@@ -57,3 +57,29 @@
57
57
 
58
58
 
59
59
  ※参考サイトのやり方自体は、Springが用意してくれている仕組みに乗っかって行われているわけなので、もし「このサイトの方法以外の解決はないか?」を質問されているのなら、無い、またはあってもスジが良いとは言えないのでは、と思います。
60
+
61
+
62
+
63
+
64
+
65
+ (追記)
66
+
67
+ サービスメソッドに@Transactionalがついているので、TransactionManagerに設定されているDataSourceが使用されているんじゃないでしょうか。
68
+
69
+
70
+
71
+ そこに作成されたRoutingDataSourceが刺さってない、ということかもしれません。参考サイトは@Transactionalついてないですし、そこ設定するコード含まれてないですね。
72
+
73
+
74
+
75
+ ```xml
76
+
77
+ <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
78
+
79
+ <property name="dataSource" ref="dataSource"/> <--コレがRoutingDataSourceをrefしないとダメかも -->
80
+
81
+ </bean>
82
+
83
+ ```
84
+
85
+ [Spring - データアクセス リファレンスドキュメント](https://spring.pleiades.io/spring-framework/docs/current/reference/html/data-access.html)