[Seasar-user:3683] Re: コネクションプール

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2006年 5月 24日 (水) 01:01:11 JST


小林 (koichik) です.

Date:    Sat, 20 May 2006 03:00:54 +0900
From:    Koichi Kobayashi <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:3665] Re: コネクションプール

> > 複数のコネクションプールを設定してユーザの種類によって
> > 接続DBを変えたいのですが、可能でしょうか?
> 
> DataSource の Proxy みたいなのを作るのはいかがでしょうか?

org.seasar.extension.component.impl.SelectableDataSourceProxy

というクラスをトランク (S2.4 系),ブランチ (S2.3 系) 両方の
 SVN にコミットしました.

これを例えば datasource.dicon なんかに記述して,

<components>
  <include path="datasource1.dicon"/>
  <include path="datasource2.dicon"/>

  <component
    class="org.seasar.extension.component.impl.SelectableDataSourceProxy"
  />
</components>

datasource1.dicon および datasource2.dicon には別々の
名前の付いた DataSource を定義しておきます.

次のようなインターセプタを用意します.

public class SelectDataSourceInterceptor implements MethodInterceptor {
  private SelectableDataSourceProxy proxy;
  public void setDataSourceProxy(SelectableDataSourceProxy proxy) {
    this.proxy = proxy;
  }

  public Object invoke(MethodInvocation invocation) throws Throwable {
    String currentName = proxy.getDataSourceName();
    try {
      String dataSourceName = getDataSourceName();
      proxy.setDataSourceName(dataSourceName);
      return invocation.proceed();
    } finally {
      proxy.setDataSourceName(currentName);
  }

  public String getDataSourceName() {
    //ユーザの種類に応じたデータソース名を返す.
  }
}

getDataSourceName() メソッドが返すのは datasource1.dicon や
datasource2.dicon に定義されたデータソースの名前です.

このインターセプタをサービス層あるいはロジック層などに
適用することで,S2Dao などはユーザの種類に応じた
データソースを通して DB にアクセスすることができます.


-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内