[seasar-dotnet:995] Re: 動的に複数DBファイルを作成して、複数同時にアクセス

Yoshihiro OSHITA [E-MAIL ADDRESS DELETED]
2008年 10月 18日 (土) 07:04:33 JST


久保様、
お世話になっています、大下です。

S2Container.NETには似たようなクラスがありますね。
Seasar.Extension.ADO.Impl.SelectableDataSourceProxyWithContainer

SelectableDataSourceProxyWithContainer#GetDataSource
でコンテナが保持しているDataSourceを取得できそうだと思ったのですが、
取得できるDataSourceは、あらかじめDiconファイルに書いておいたDataSource(なわけですよね?)

私の扱っているケースの場合は、DataSourceを動的に作成して、必要に応じて増やしていく必要があるので、Diconファイルにかかれている内容をプログラム上で表現してやってはどうだろうと思い、とりあえず次のようなコードを書いてみました。
下記コードでは、DataSourceを動的に作成(S2Dao.NETの恩恵も受けたいので、さらにS2DaoInterceptorを適用)してみようとしています。
しかし、DataSourceをつくったものの、それはどこに登録しておけばいいのかよくわからないのと、S2DaoIntercepterをDiconファイルに書かずにAcpectできそうにない(できないですか?)ことがなんとなく分かって、この方法ではだめっぽいなぁと思いました。
#なんだか、すごく変なことやってますねぇ、すみません。
---------------------------------------------
// DataSourceを動的に作成して、S2DaoInterceptorをAspectできるのか実験
static void Main(string[] args)
{
  // 接続文字列を作成する
  SQLiteConnectionStringBuilder conn = new SQLiteConnectionStringBuilder();
      // 一意なDBファイル名をここで作成
   conn.DataSource = Guid.NewGuid().ToString + ".SQ3";
   conn.FailIfMissing = false;
   conn.SyncMode = SynchronizationModes.Normal;
   conn.DateTimeFormat = SQLiteDateFormats.ISO8601;
   conn.CacheSize = 2000;
   conn.PageSize = 1024;
   conn.LegacyFormat = true;
   conn.DefaultTimeout = 30;

   // データプロバイダ
   DataProvider dp = new DataProvider();
   dp.ConnectionType = "System.Data.SQLite.SQLiteConnection";
   dp.CommandType = "System.Data.SQLite.SQLiteCommand";
   dp.ParameterType = "System.Data.SQLite.SQLiteParameter";
   dp.DataAdapterType = "System.Data.SQLite.SQLiteDataAdapter";

   //データソース
   //IDataSource dataSource = new TxDataSource(dp, conn.ToString());
   IDataSource dataSource = new DataSourceImpl(dp, conn.ToString());
   // つくったはいいが、
   // SelectableDataSourceProxyWithContainerに
   // Registerらしきメソッドはないようだ…

  // S2Dao.NETのDaoInterceptorとそれに必要なコンポーネント
  BasicCommandFactory cmdFactory = new BasicCommandFactory();
  BasicDataReaderFactory dataReaderFactory = new BasicDataReaderFactory();
  FieldAnnotationReaderFactory annoReaderFactory = new
FieldAnnotationReaderFactory();
  DaoMetaDataFactoryImpl daoMetadataFactory
                = new DaoMetaDataFactoryImpl(
                     dataSource, cmdFactory , annoReaderFactory,
dataReaderFactory);

   S2DaoInterceptor s2daoInterceptor = new
S2DaoInterceptor(daoMetadataFactory);

    // Aspectの組み込み
    IPointcut pointcut = new PointcutImpl(new string[] {"Insert" });
    IAspect aspect = new AspectImpl(s2daoInterceptor, pointcut);
    AopProxy aopProxy
                = new AopProxy(
                      typeof(ILibraryDao), new IAspect[] { aspect },null,
/*あれ?与えるものがない?*/);
 }

    [Bean(typeof(Library))]
    public interface ILibraryDao
    {
        Library[] GetAllLibraries();
        int Insert(Library library);
        int Update(Library library);
        int Delete(Library library);
    }
---------------------------------------------

2008/10/17 10:41 kubo <[E-MAIL ADDRESS DELETED]>:

> 久保(jflute)です。
>
> すいません、QuillじゃなくてS2Container.NETにも
> SelectableDataSourceProxyWithDictionaryはあるようです。
>
>
> # 既にS2Container.NETの知識が忘却の彼方・・・
>
> 2008/10/17 kubo <[E-MAIL ADDRESS DELETED]>:
> > 久保(jflute)です。
> >
> > 了解です。
> > それならば、事前にEntityもSQLも作成しておくことは
> > 可能ということですね。
> >
> > トランザクションの扱いがうまく行かないかもですが、
> > QuillのSelectableDataSourceProxyWithDictionaryを使って、
> > DataSourceを切り替えることが可能かもしれません。
> > これは、冗長化したDBのDataSourceを状況によって
> > 切り替えるもので、ちょっと今回と用途は違いますが、
> > 「このEntityを使う時はこっちのDataSourceを利用」
> > という形で切り替えられるかもしれません。
> >
> > それでダメなら、ADO.NETを直利用にならざるを
> > 得ないかと思います。
> >
> >
> > 2008/10/16 Yoshihiro OSHITA <[E-MAIL ADDRESS DELETED]>:
> >> 久保様、
> >> お世話になっています、大下です。
> >>
> >> テーブル構造自体は決まっており、動的に変更することはありません。
> >> よって、前者の
> >>
> >>>固定構造のテーブル
> >>
> >> をもったDBファイルを(複数)作成することになります。
> >>
> >> 2008/10/16 21:13 kubo <[E-MAIL ADDRESS DELETED]>:
> >>>
> >>> 久保(jflute)です。
> >>>
> >>> SQLiteのDBファイルを動的に作成した後、
> >>> その作成したDBには固定構造のテーブルが作成されるのでしょうか?
> >>> それともそのテーブル構造も動的で開発時には決定しないものでしょうか?
> >>> 少なくとも後者であれば、固定のDaoとEntityが準備できないため、
> >>> S2Daoの利用は難しいかと思います。
> >>>
> >>> 2008/10/16 Yoshihiro OSHITA <[E-MAIL ADDRESS DELETED]>:
> >>> > 小谷様、
> >>> > お世話になっています、大下です。
> >>> > 回答ありがとうございます。
> >>> > TxDataSourceのソース、確認してみます。
> >>> > ただ、私の扱っているケースだとSQLiteのDBファイルを動的に作成してやる必要があるのですが、
> >>> > これをSeasarでやるには、動的にTxDataSourceを作成して、
> >>> > コンテナにデプロイしてやる必要があるのでしょうか?
> >>> >
> >>> > 2008/10/16 10:52 koyak <[E-MAIL ADDRESS DELETED]>:
> >>> >>
> >>> >> 小谷です。
> >>> >>
> >>> >> データソース+トランザクションで関連するソースは
> >>> >> 色々ありますが
> >>> >> データソースの中身を追うのであれば
> >>> >> Seasar.Extension.Tx.Impl.TxDataSource
> >>> >> Seasar.Extension.ADO.Impl.DataSourceImpl (TxDataSourceがこれを継承しているので)
> >>> >>
> >>> >> トランザクション制御の中身を追うのであれば
> >>> >> Seasar.Extension.Tx.Impl.XxxTxHandlerのHandleTransactionメソッド
> >>> >> (一番読みやすいのは多分LocalRequiredTxHandler)
> >>> >>
> >>> >> あたりから読んでいくのが個人的にはオススメです。
> >>> >>
> >>> >> また、(何の保証もできないのですが(^^;)
> >>> >> 一からデータソース相当のものを書かなくても
> >>> >> TxDataSourceを継承して一部を必要な分だけ書き換える、
> >>> >> (コンストラクタやGetConnectionなど)
> >>> >> という手もあるかもしれません。
> >>> >>
> >>> >> 2008/10/16 0:59 Y. Oshita <[E-MAIL ADDRESS DELETED]>:
> >>> >> > お世話になっています、大下です。
> >>> >> > 何度も恐縮です。
> >>> >> > ソースを読むといったものの、どのあたりを見ればいいか悩んでおります。
> >>> >> > トランザクションを使うので、Seasar.Extension.Tx.Impl.TxDataSourceあたりでしょうか?
> >>> >> >
> >>> >> > 2008/10/16 0:06 Yoshihiro OSHITA <[E-MAIL ADDRESS DELETED]>:
> >>> >> >>
> >>> >> >> 久保様、杉本様、
> >>> >> >> お世話になっています、大下です。
> >>> >> >> 回答ありがとうございました。
> >>> >> >> ソースを読んでみることにします。
> >>> >> >>
> >>> >> >> 2008/10/15 22:41 Kazuya Sugimoto <[E-MAIL ADDRESS DELETED]>:
> >>> >> >>>
> >>> >> >>> 杉本です。
> >>> >> >>>
> >>> >> >>> > 基本的にプロセス起動時に読んでそれ以降は見ないのでは。。。
> >>> >> >>> > (他のコミッタの方、どうです!?)
> >>> >> >>> アプリケーション構成ファイルを書き換えても、ConfigurationManagerで取得する
> >>> >> >>> 値は起動時から変わらないと思います。
> >>> >> >>>
> >>> >> >>> >>> Seasar.NET自体が内部でやっている「DataSourceの生成」と同じことを
> >>> >> >>> >>> アプリ上で自分自身で行う必要があるかと思います。
> >>> >> >>> > が、制御しやすく一番わかりやすいかと思います。
> >>> >> >>> 私もこういう方法になるんじゃないかと思います。
> >>> >> >>>
> >>> >> >>>
> >>> >> >>> 2008/10/15 22:21 kubo <[E-MAIL ADDRESS DELETED]>:
> >>> >> >>> > 久保です。
> >>> >> >>> >
> >>> >> >>> >> If false, the database will be created automatically.
> >>> >> >>> >> とあるように、自動的に「Library.SQ3」というDBファイルを作成してくれます。
> >>> >> >>> >
> >>> >> >>> > なるほど、この辺は組み込み系DB特有のものですね。
> >>> >> >>> > JavaでもH2やApacheDerbyが同じような機能もってます。
> >>> >> >>> >
> >>> >> >>> >> 直接App.configにxmlをがりがり書き込めばいいのかもしれませんが、まだ試してい
> >>> >> >>> >> ません。
> >>> >> >>> >> それに、このようにして書いた接続文字列をコンテナが読み取ってくれるのだろうか
> >>> >> >>> >> という疑問もあります。
> >>> >> >>> >
> >>> >> >>> > 個人的な見解では、ダメなような気がします。
> >>> >> >>> > .NETがどのようにApp.configを扱っているか次第ですが、
> >>> >> >>> > 基本的にプロセス起動時に読んでそれ以降は見ないのでは。。。
> >>> >> >>> > (他のコミッタの方、どうです!?)
> >>> >> >>> >
> >>> >> >>> >>> Seasar.NET自体が内部でやっている「DataSourceの生成」と同じことを
> >>> >> >>> >>> アプリ上で自分自身で行う必要があるかと思います。
> >>> >> >>> > が、制御しやすく一番わかりやすいかと思います。
> >>> >> >>> >
> >>> >> >>> > 2008/10/15 Yoshihiro OSHITA <[E-MAIL ADDRESS DELETED]>:
> >>> >> >>> >> 久保様、
> >>> >> >>> >> お世話になります、大下です。
> >>> >> >>> >>
> >>> >> >>> >>> アプリケーションのプログラムから「新しい接続先」をCREATEして、
> >>> >> >>> >>> その作ったばかりの接続先にDBアクセスするということでしょうか?
> >>> >> >>> >>
> >>> >> >>> >> そうですね。接続文字列は、
> >>> >> >>> >>
> >>> >> >>> >> "Data Source=Library.SQ3;FailIfMissing=False;…;Default
> >>> >> >>> >> Timeout=30"
> >>> >> >>> >>
> >>> >> >>> >> のようにしています。「FailIfMissing=False」 としておくと、
> >>> >> >>> >> (SQLite.NETのヘルプから抜粋しますが、)
> >>> >> >>> >> If set to true, will throw an exception if the database
> >>> >> >>> >> specified
> >>> >> >>> >> in
> >>> >> >>> >> the
> >>> >> >>> >> connection string does not exist.
> >>> >> >>> >> If false, the database will be created automatically.
> >>> >> >>> >> とあるように、自動的に「Library.SQ3」というDBファイルを作成してくれます。
> >>> >> >>> >>
> >>> >> >>> >> ただ、実際のプログラムではDBファイル名を動的に作成するので、
> >>> >> >>> >> あらかじめ設定ファイルに記述しておくことはできません。
> >>> >> >>> >>
> >>> >> >>> >> ならば、動的につくったDBファイル名を含む接続文字列をApp.configに書き込んでや
> >>> >> >>> >> ればどうだろう
> >>> >> >>> >> と思ったのですが、接続文字列はアプリケーション設定に属するらしく、プログラム
> >>> >> >>> >> 上から書き込めませんでした。
> >>> >> >>> >> 直接App.configにxmlをがりがり書き込めばいいのかもしれませんが、まだ試してい
> >>> >> >>> >> ません。
> >>> >> >>> >> それに、このようにして書いた接続文字列をコンテナが読み取ってくれるのだろうか
> >>> >> >>> >> という疑問もあります。
> >>> >> >>> >>
> >>> >> >>> >> でも、久保さんのお言葉から察すると、
> >>> >> >>> >>
> >>> >> >>> >>> Seasar.NET自体が内部でやっている「DataSourceの生成」と同じことを
> >>> >> >>> >>> アプリ上で自分自身で行う必要があるかと思います。
> >>> >> >>> >>
> >>> >> >>> >> をやる必要がありそうですね?
> >>> >> >>> >>
> >>> >> >>> >>> 久保(jflute)です。
> >>> >> >>> >>>
> >>> >> >>> >>>> SQLiteのDBアクセスにS2Container.NET,S2Dao.NETを利用しているのですが、
> >>> >> >>> >>>> 動的に作成した複数のDBファイルへの同時アクセスはどのようにすればよいで
> >>> >> >>> >> しょうか?
> >>> >> >>> >>>
> >>> >> >>> >>> SQLiteは使ったことないのですが、確認させて下さい。
> >>> >> >>> >>> アプリケーションのプログラムから「新しい接続先」をCREATEして、
> >>> >> >>> >>> その作ったばかりの接続先にDBアクセスするということでしょうか?
> >>> >> >>> >>>
> >>> >> >>> >>>> にあるように、きめ打ちで「Library.SQ3」を指定してやる分には、うまく動いて
> >>> >> >>> >> いるのですが、
> >>> >> >>> >>>> このDBファイルを動的に複数作成して、複数同時にデータを書き込んだりする必
> >>> >> >>> >> 要があります。
> >>> >> >>> >>>> この場合は、どのように設定すればよいでしょうか?
> >>> >> >>> >>>
> >>> >> >>> >>> 少なくとも設定ファイルに書くやり方では無理だと思います(静的なので)。
> >>> >> >>> >>> Seasar.NET自体が内部でやっている「DataSourceの生成」と同じことを
> >>> >> >>> >>> アプリ上で自分自身で行う必要があるかと思います。
> >>> >> >>> >>> また、DataSourceを動的に作れたとしても静的なDaoインターフェースから
> >>> >> >>> >>> その作ったばかりの接続先にアクセスするのは難しいかと思いますので、
> >>> >> >>> >>> その場合ADO.NETを直接利用する形になるかと思います。
> >>> >> >>> >>>
> >>> >> >>> >>> #
> >>> >> >>> >>> # コミッタの方で同じようなことやったことある人いらっしゃいます?
> >>> >> >>> >>> #
> >>> >> >>> >>
> >>> >> >
> >>> >> >
> >>> >> > _______________________________________________
> >>> >> > seasar-dotnet mailing list
> >>> >> > [E-MAIL ADDRESS DELETED]
> >>> >> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> >>> >> >
> >>> >> >
> >>> >> _______________________________________________
> >>> >> seasar-dotnet mailing list
> >>> >> [E-MAIL ADDRESS DELETED]
> >>> >> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> >>> >
> >>> >
> >>> > _______________________________________________
> >>> > seasar-dotnet mailing list
> >>> > [E-MAIL ADDRESS DELETED]
> >>> > https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> >>> >
> >>> >
> >>> _______________________________________________
> >>> seasar-dotnet mailing list
> >>> [E-MAIL ADDRESS DELETED]
> >>> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> >>
> >>
> >> _______________________________________________
> >> seasar-dotnet mailing list
> >> [E-MAIL ADDRESS DELETED]
> >> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
> >>
> >>
> >
> _______________________________________________
> seasar-dotnet mailing list
> [E-MAIL ADDRESS DELETED]
> https://ml.seasar.org/mailman/listinfo/seasar-dotnet
>
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: <http://ml.seasar.org/archives/seasar-dotnet/attachments/20081018/305dd3b6/attachment-0001.html>


seasar-dotnet メーリングリストの案内