DBの設定情報は、可変のため設定ファイルではなく別のマスターDBにあります。そのためデータソースは@Autowiredで自動生成ではなく、動的に生成しないといけません。このように、作成したデータソースをどのようにすればmybatis-springで使えるようになるのでしょうか。そもそも不可能なのでしょうか…。よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
詳しい状況がわからないのでふわっとした回答になりますが、SpringのdataSource設定のurl
やuser
, password
などを定数ではなくDBから取得した値にするにはどうしたらいいか?という質問でよろしいでしょうか。
その場合、DB設定が入っているマスターDBにアクセスするdataSourceとマッパーを作り、そのマッパーを使ってDBから値を取得し、取得した値をbeanとして登録するようなBeanFactoryを作ればいいと思います。dataSourceの方では、<property name="url" ref="dbUrl"/>
のように、作成したBeanFactoryによって生成されたbeanを参照する記述にすればいいでしょう。
かなり適当ですが、bean定義のxmlの例を載せてみます。
xml
1 <context:component-scan base-package="com.teratail"/> 2 <!-- マスターDBのMyBatis設定 --> 3 <bean id="masterDataSource" 4 class="org.apache.commons.dbcp.BasicDataSource"> 5 <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> 6 <property name="url" value="jdbc:mysql://localhost:3306/teratail"/> 7 <property name="username" value="root"/> 8 <property name="password" value=""/> 9 <property name="initialSize" value="50"/> 10 <property name="maxActive" value="50"/> 11 </bean> 12 <bean id="sqlSessionFactory" 13 class="org.mybatis.spring.SqlSessionFactoryBean"> 14 <property name="dataSource" ref="masterDataSource"/> 15 <property name="mapperLocations" value="classpath*:mappers/*.xml"/> 16 </bean> 17 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 18 <property name="basePackage" value="com.teratail.mappers"/> 19 </bean> 20 21 <!-- マスターDBから読み込んだDB設定情報 --> 22 <bean id="dbConfigFactoryBean" class="com.teratail.factories.DbConfigFactoryBean"/> 23 <bean id="url" factory-bean="dbConfigFactoryBean" factory-method="url"/> 24 <bean id="port" factory-bean="dbConfigFactoryBean" factory-method="port"/> 25 <bean id="user" factory-bean="dbConfigFactoryBean" factory-method="user"/> 26 <bean id="password" factory-bean="dbConfigFactoryBean" factory-method="password"/> 27 <!-- 本来アクセスしたいDBのdataSource --> 28 <bean id="dataSource" 29 class="org.apache.commons.dbcp.BasicDataSource"> 30 <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> 31 <property name="url" ref="url"/> 32 <property name="username" ref="user"/> 33 <property name="password" ref="password"/> 34 <property name="initialSize" value="50"/> 35 <property name="maxActive" value="50"/> 36 </bean>
序盤はマスターDBにアクセスするためのMybatisの設定です。マスターDBの設定には定数を使えるわけですよね?肝となるのが中盤で、序盤の設定で作成したマッパーを用いてマスターDBからDB設定を取得し、url
やuser
などを返すメソッドを定義しているBeanFactoryを定義しています。BeanFactoryの中身はこんな感じになるでしょう。
java
1package com.teratail.factories; 2 3import com.teratail.entities.DbConfig; 4import com.teratail.mappers.DbConfigMapper; 5import org.springframework.beans.factory.annotation.Autowired; 6 7public class DbConfigFactoryBean { 8 private final DbConfigMapper dbConfigMapper; 9 private final DbConfig dbConfig; 10 11 @Autowired 12 public DbConfigFactoryBean(DbConfigMapper dbConfigMapper) { 13 this.dbConfigMapper = dbConfigMapper; 14 this.dbConfig = dbConfigMapper.findOne(); 15 } 16 17 public String url() { 18 return dbConfig.getUrl(); 19 } 20 21 public int port() { 22 return dbConfig.getPort(); 23 } 24 25 public String user() { 26 return dbConfig.getUser(); 27 } 28 29 public String password() { 30 return dbConfigMapper.all().getPassword(); 31 } 32}
DbConfig
というのはDB設定情報を格納するために適当に作ったクラスです。で、上記のクラスが返す値をbeanとしてDIコンテナに登録するための記述がBeanFactory定義の下に続いています。
これらのbeanが定義できたら、その値を参照するようなdataSourceを最後に定義して終わりです。こうすれば起動時にマスターDBからDB設定情報を持ってこれるようになります。
投稿2016/08/12 10:20
編集2016/08/12 10:55退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。