[Seasar-user:21159] Re: 動的なデータソース切り替えについて

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2011年 11月 16日 (水) 20:00:21 JST


小林 (koichik) です.

> デフォルトではJdbcManagerやDataSourceFactoryがシングルトン(デフォルトのライフサイクル)のため、
> 一度dataSourceFactory.setSelectableDataSourceName(dataSourceName)を実行してしまうと、
> 次のリクエストから同じDBのコネクションを取得してしまいます。

Interceptor で datasourceName を設定しているなら、try〜finally で
確実に初期値に戻せるはず。
というか、次のリクエストでも Interceptor が datasourceName を
設定するはずですよね?

> また、複数スレッドから同時アクセスされる場合、タイミングによっては、
> 適切なDBへのコネクションが取れないのではないかと思います。

ThreadLocal に情報を持っているのでその心配はありません。


Date: Wed, 16 Nov 2011 10:19:23 +0900
From: 大久保俊 <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:21144] 動的なデータソース切り替えについて

> お世話になっております。大久保と申します。
> 
> 現在、SAStruts+S2JDBCを使ってウェブアプリケーションを作成しています。
> 
> 今回、『Seasar2徹底入門』の7.3章の「動的にデータソースを切り替える」を参考に、
> DBの振り分け(マスタ、スレーブ)をしようと考えています。
> (SelectableDataSourceProxyを使う方法です。)
> 具体的には、Actionのメソッドに対してアノテーションでマスタ向けかスレーブ向けかを指定し、
> SwichDataSourceInterceptorでアノテーションの情報を元に、
> dataSourceFactory.setSelectableDataSourceName(dataSourceName)を実行しています。
> (アノテーションがない場合は、マスタ向けとしています。)
> 
> デフォルトではJdbcManagerやDataSourceFactoryがシングルトン(デフォルトのライフサイクル)のため、
> 一度dataSourceFactory.setSelectableDataSourceName(dataSourceName)を実行してしまうと、
> 次のリクエストから同じDBのコネクションを取得してしまいます。
> また、複数スレッドから同時アクセスされる場合、タイミングによっては、
> 適切なDBへのコネクションが取れないのではないかと思います。
> (間違っていたら、ごめんなさい。)
> 
> この対応として、JdbcManagerのライフサイクルをrequestに変更しようかと考えています。
> 動作やパフォーマンスの面で、この方法で大丈夫でしょうか?
> もし、もっと良い方法があれば、ご教示いただければ幸いです。
> 
> 以下、実行環境です。
> Java 1.6
> Tomcat 6.0
> Seasar 2.4.41
> 
> 分かりにくい説明で申し訳ございませんが、よろしくお願いいたします。

--
{
  name: "Koichi Kobayashi",
  mail: "[E-MAIL ADDRESS DELETED]",
  blog: "http://d.hatena.ne.jp/koichik/",
  twitter: "@koichik"
 }



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