[seasar-dotnet:973] Re: Quillのデータソース優先順序について質問

k.moriwaki [E-MAIL ADDRESS DELETED]
2008年 10月 17日 (金) 09:51:50 JST


小谷さん
森脇です

昨日教えていただいた対応案を試してみました。
結果から申し上げますと例外が発生し実行出来ませんでした。
もう少し試してみたいと思いますが取り急ぎご報告まで。



以下、修正内容と例外になります。

----- 例外 -----
Seasar.Quill.Exception.QuillApplicationException:
[EQLL0024]TransactionInterceptorのインスタンスが生成されていません。
   場所 Seasar.Quill.AspectBuilder.GetMethodInterceptor(TransactionAttribute
txAttr)
   場所 Seasar.Quill.AspectBuilder.AddMethodNamesForTxPointcut(IDictionary`2
methodNames, String methodName, TransactionAttribute txAttr)
   場所 Seasar.Quill.AspectBuilder.CreateTxAspectList(MethodInfo[] methods)
   場所 Seasar.Quill.AspectBuilder.CreateFromTransactionAttribute(Type
targetType, MethodInfo[] methods, List`1 aspectList)
   場所 Seasar.Quill.AspectBuilder.CreateAspects(Type type)
   場所 Seasar.Quill.QuillContainer.GetComponent(Type type, Type implType)
   場所 Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo
field, Type implType)
   場所 Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo
field, ImplementationAttribute implAttr)
   場所 Seasar.Quill.QuillInjector.InjectField(Object target, FieldInfo field)
   場所 Seasar.Quill.QuillInjector.Inject(Object target)


> 1.S2ContainerとQuillContainerの初期化のタイミング
上記対応でGlobal.asaxを作成し起動時にS2を初期化

----- Global.asax-----
  (略)

    Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        ' アプリケーションの起動時に呼び出されます。

        '' Log4Netの初期化
        log4net.Config.XmlConfigurator.Configure()

        '' Seasarの初期化
        SingletonS2ContainerFactory.Init()
    End Sub

  (略)

----- App.dicon -----
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
  <include path ="OracleEx.dicon"/>

  <component name="traceInterceptor"
               class="Seasar.Framework.Aop.Interceptors.TraceInterceptor"/>

  <component name ="service" class ="App.WebService.ServiceImpl">
    <aspect>traceInterceptor</aspect>
    <aspect>OracleEx.LocalRequiredTx</aspect>
  </component>

</components>

----- OracleEx.dicon -----
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components namespace="OracleEx">

  <!-- データプロバイダ -->
  <component name="Oracle" class="Seasar.Extension.ADO.DataProvider">
    <property name="ConnectionType">"System.Data.OracleClient.OracleConnection"</property>
    <property name="CommandType">"System.Data.OracleClient.OracleCommand"</property>
    <property name="ParameterType">"System.Data.OracleClient.OracleParameter"</property>
    <property name="DataAdapterType">"System.Data.OracleClient.OracleDataAdapter"</property>
  </component>

  <!-- データソース -->
  <component name="DataSource" class="Seasar.Extension.Tx.Impl.TxDataSource">
    <property name="DataProvider">Oracle</property>
    <property name="ConnectionString">"User Id=hoge;Password=hoge;Data
Source=hogedb;"</property>
  </component>

  <!-- S2Dao.NETのDaoInterceptorとそれに必要なコンポーネント -->
  <component class="Seasar.Extension.ADO.Impl.BasicDataReaderFactory" />
  <component class="Seasar.Extension.ADO.Impl.BasicCommandFactory" />
  <component class="Seasar.Dao.Impl.DaoMetaDataFactoryImpl" />
  <component class="Seasar.Dao.Impl.FieldAnnotationReaderFactory" />
  <component name="DaoInterceptor"
      class="Seasar.Dao.Interceptors.S2DaoInterceptor"/>

  <!-- ローカルトランザクション用のインターセプター -->
  <component name="LocalRequiredTx"
class="Seasar.Extension.Tx.TransactionInterceptor">
    <arg>
      <component class="Seasar.Extension.Tx.Impl.LocalRequiredTxHandler" />
    </arg>
    <property name="TransactionStateHandler">TransactionContext</property>
  </component>

  <!-- ローカルトランザクション用のインターセプターで使用します -->
  <component name="TransactionContext"
class="Seasar.Extension.Tx.Impl.TransactionContext">
    <property name="IsolationLevel">System.Data.IsolationLevel.ReadCommitted</property>
  </component>

</components>


> 2.Quillデフォルトのトランザクション設定の無効化
上記対応でクラスを作成し登録。

----- IgnoreTxSetting.vb -----
Imports Seasar.Quill.Database.Tx.Impl

Namespace Util

    Public Class IgnoreTxSetting : Inherits AbstractTransactionSetting

        Protected Overrides Sub SetupTransaction(ByVal dataSource As
Seasar.Extension.ADO.IDataSource)
            '' 使用されることはないので空実装
        End Sub

        Public Overrides Function IsNeedSetup() As Boolean
            ''  固定でfalseを返す
            Return False
        End Function

    End Class

End Namespace


----- Web.config -----
  (略)

  <!-- Seasar.Quill -->
  <quill>
    <!--
    <dataSources>
      <dataSource name="KankyoDB">
        <provider>Oracle</provider>
        <connectionString>"User Id=kankyo;Password=kankyo;Data
Source=kankyodb;"</connectionString>
        <class>Seasar.Extension.Tx.Impl.TxDataSource</class>
      </dataSource>
    </dataSources>
    -->
    <transactionSetting>App.WebService.Util.IgnoreTxSetting</transactionSetting>
  </quill>

  <!-- Seasar -->
  <seasar>
    <assemblys>
      <configPath>App.dicon</configPath>
      <assembly>Seasar</assembly>
      <assembly>Seasar.Dao</assembly>
      <assembly>Seasar.Quill</assembly>
      <assembly>App.DB</assembly>
      <assembly>System.Data.OracleClient, version=1.0.5000.0,
Culture=neutral, PublicKeyToken=b77a5c561934e089</assembly>
    </assemblys>
  </seasar>

  (略)


2008/10/16 21:28 koyak <[E-MAIL ADDRESS DELETED]>:
> 森脇さん
>
> 小谷です。
>
> 重要なことに二点ほど気づいたので
> 補足&訂正させて下さい。
>
> DBFluteからどのような例外が投げられたのかは分かりませんが、
> もしかすると以下の内容に対応していただくことで解決するかもしれません。
>
> 1.S2ContainerとQuillContainerの初期化のタイミング
> 前のメールではどちらが先でもいいようなことを書いてしまいましたが、
> 必ずS2Containerの方を先に初期化して下さい。
> (<assemblys>の設定もWeb.configのseasarセクションの方にお願いします)
>
> QuillContainerへのデータソース登録はQuillContainerの初期化時に行われます。
> そのため、この時点でS2Container上にデータソースのインスタンスが
> 生成済である必要があります。
>
> 2.Quillデフォルトのトランザクション設定の無効化
> トランザクションの設定を書かなくても最低限の設定は行われるように、という
> 目的でQuillではデータソースの登録後にデフォルトの
> トランザクション設定が行われます。
>
> これによりS2Container側で設定されたトランザクション設定が
> 上書きされてしまうため、Quill側のトランザクション設定を無効化する必要があります。
>
> QuillのSeasar.Quill.Database.Tx.Impl.AbstractTransactionSettingを
> 以下のように継承し、Web.configのquillセクション内のtransactionSettingに
> このクラス名を名前空間つきで書いて下さい。
>
> ○ IgnoreTxSetting.cs
> ------------------------------------------------------------------------------
> public class IgnoreTxSetting : AbstractTransactionSetting
> {
>    protected override void SetupTransaction(IDataSource dataSource){
>            //  使用されることはないので空実装
>            return;
>    }
>
>    public override bool IsNeedSetup() {
>            //  固定でfalseを返す
>            return false;
>    }
> }
>
> Web.config ---------------------------------------------------------------------------
>
> <quill>
>   <transactionSetting>(名前空間).IgnoreTxSetting</transactionSetting>
> </quill>
>
>
> 2008/10/16 20:56 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>> 小谷さん
>>
>> 森脇です。
>> 詳細な回答ありがとうございます。
>>
>>> DBFlute(.NET)とQuillとS2Containerを併用する構成は
>>> トリッキーであり、推奨はできないためです。
>> やはりそうですか…
>> こちらとしてもDIConteinerはどちらかに統一したいのですが
>> ・DBFluteを使いたい
>> ・Serviceクラス等のインスタンスモードはなるべく自由に設定したい
>> を両立できないかとPJ内で要望があり試してみた次第です。
>>
>>> ただし「理屈の上では」という前提が付きます。
>>> 実際に使って試してみていただく必要があります。
>> 本日軽く試してみてDBFluteで例外が発生したため、そもそも出来ない
>> 組み合わせなのか気になってメールで質問させていただきました。
>> 理論上は出来るとのことであれば、明日再度試してみたいと思います。
>>
>>
>> 以上、よろしくお願いいたします。
>>
>>
>> 2008/10/16 18:40 koyak <[E-MAIL ADDRESS DELETED]>:
>>> 森脇さん
>>>
>>> 小谷です。
>>>
>>>> ちなみに今回私が修正したやり方でQuillを使うにあたり問題ないでしょうか?
>>>
>>> ほぼ問題ありません。
>>> ただ、アセンブリ(assemblys)の設定は
>>> S2ContainerとQuillContainerのうち先に初期化
>>> (S2ContainerのInitとQuillInjectorのGetInstanceを呼ぶタイミング)
>>> される方に書いた方がいいかと思います。
>>>
>>> S2Containerの方が先に初期化される場合は
>>> Web.configのSeasarセクションの中にあるassemblysへの設定を
>>> お願い致します。
>>>
>>>>DataSorceの取得をS2Conteinerから取得するように変更した場合、
>>>>トランザクションが問題なく設定されるかが気になっています。
>>>
>>> ・トランザクションの設定(TransactionInterceptorなどの記述)は
>>>  全てS2Container(dicon)上で行う
>>> ・トランザクション境界は必ずS2Container管理(dicon)のコンポーネント上に設定する
>>>
>>> 場合は問題なく設定されます。
>>>
>>> ただし「理屈の上では」という前提が付きます。
>>> 実際に使って試してみていただく必要があります。
>>> DBFlute(.NET)とQuillとS2Containerを併用する構成は
>>> トリッキーであり、推奨はできないためです。
>>>
>>> ※複数データソースを切り替えて使う場合、もう少し複雑な話になるため
>>> その場合は別途お知らせ下さい。
>>>
>>>
>>> 以下は上記回答の根拠についての話のため、
>>> 読み飛ばしていただいても大丈夫です。
>>>
>>>
>>> dicon上に(のみ)記述されたデータソースのインスタンスは
>>> 以下の流れで使用されます。
>>>
>>> 1.S2Container上でインスタンス生成
>>> 2.Quillの共通データソースに1のインスタンスが設定される
>>> 3.DBFluteは2.の共通データソースを使いDBに接続する
>>>
>>> 上で書いたように
>>> ・トランザクションの設定(TransactionInterceptorなどの記述)は
>>>  全てS2Container(dicon)上で行う
>>> ・トランザクション境界は必ずS2Container管理(dicon)のコンポーネント上に設定する
>>>
>>> という設定をしていただいた場合、
>>> トランザクション管理で使用されるコンポーネントも
>>> 1.で生成されたものと同じデータソースのインスタンスを使って
>>> トランザクション管理を行います。
>>>
>>> トランザクション管理とDBアクセスとで同じデータソースの
>>> インスタンスが使用されるため、正常に動作するはずです。
>>>
>>> -----------------------------------------------------------------
>>> koyak
>>> [E-MAIL ADDRESS DELETED]
>>> -----------------------------------------------------------------
>>>
>>> 2008/10/16 17:24 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>> 森脇です。
>>>> 少し言葉足らずでした。
>>>>
>>>> DataSorceの取得をS2Conteinerから取得するように変更した場合、
>>>> トランザクションが問題なく設定されるかが気になっています。
>>>>
>>>> 先日質問しましたが、現在Quill+DBFluteの組み合わせの検証をしており、
>>>> QuillではDBFluteのクラスのみを管理し、データソースやトランザクション
>>>> その他のクラスはS2Conteinerで管理することはできないか試していたところです。
>>>>
>>>>
>>>> # JavaのS2、DBFluteの開発経験者が多いためなるべく
>>>> # Javaと同じような環境にしたいためです。
>>>>
>>>> 2008/10/16 16:44 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>>> 小谷さん
>>>>>
>>>>> 森脇です。回答ありがとうございます。
>>>>>
>>>>>> 説明文の記述不足でした。
>>>>>> 申し訳ありません。
>>>>>> 近いうちにドキュメントを修正したいと思います。
>>>>> 了解しました、よろしくお願いいたします。
>>>>>
>>>>> ちなみに今回私が修正したやり方でQuillを使うにあたり問題ないでしょうか?
>>>>>
>>>>>
>>>>> 2008/10/16 16:18 koyak <[E-MAIL ADDRESS DELETED]>:
>>>>>> 森脇さん
>>>>>>
>>>>>> 小谷です。
>>>>>>
>>>>>>> web.configのconnectionStringsを以下の用に変更する事により取得出来るようになりましたが
>>>>>>> これは仕様でしょうか?
>>>>>>
>>>>>> .NETの仕様が関係している可能性があります。
>>>>>> http://msdn.microsoft.com/ja-jp/library/ms178685(VS.80).aspx
>>>>>>
>>>>>> 関係すると思われる個所を抜粋します。
>>>>>> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>>>>> すべての .NET Framework アプリケーションは、
>>>>>> systemroot\Microsoft .NET\Framework\versionNumber\CONFIG\Machine.config ファイルから
>>>>>> 基本構成設定と既定の設定を継承します。Machine.config ファイルは、サーバー全体の構成設定のために使用されます。
>>>>>> これらの設定の一部は、階層内の下位の構成ファイルでオーバーライドできません。
>>>>>>
>>>>>> .NET クライアント アプリケーション (コンソール アプリケーションおよび Windows アプリケーション) は、
>>>>>> ApplicationName.config という構成ファイルを使用して、継承した設定をオーバーライドします。
>>>>>> ASP.NET アプリケーションは、Web.config という構成ファイルを使用して、継承した設定をオーバーライドします。
>>>>>> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>>>>>>
>>>>>> こちらの記述から、App.config,Web.configにconnectionStringセクションががなかったため
>>>>>> machine.configの設定が使われてしまったものと思われます。
>>>>>>
>>>>>> 説明文の記述不足でした。
>>>>>> 申し訳ありません。
>>>>>> 近いうちにドキュメントを修正したいと思います。
>>>>>>
>>>>>>
>>>>>> 2008/10/16 15:48 k. moriwaki <[E-MAIL ADDRESS DELETED]>:
>>>>>>> 森脇と申します。
>>>>>>>
>>>>>>> Quillの機能について現在調査中なのですが、表題の件について確認したい事があります。
>>>>>>>
>>>>>>> 後述しますQuillのデータソースの設定について書かれているページにて
>>>>>>> 保持されるデータソースの優先順序について書かれていますが、
>>>>>>> その優先順位通りにデータソースが設定されませんでした。
>>>>>>>
>>>>>>> 参考としたページ
>>>>>>> diconファイルを書かずにSeasarの機能を利用する - データソースの設定
>>>>>>> http://s2container.net.seasar.org/ja/quill.html#nodicon_config
>>>>>>>
>>>>>>> 優先順位は以下のようになっており
>>>>>>> 1.App.config内quillセクションのdataSources、dataSourceの設定
>>>>>>> 2.App.config内ConnectionStringsセクションの設定
>>>>>>> 3.XXX.dicon内に記述された設定
>>>>>>> 3.のdiconから取得を試そうとしたのですが、
>>>>>>> %SystemRoot%/Microsoft.NET/Framework/V2.0.*/config/machine.config の
>>>>>>> 設定が優先されうまく取得できませんでした。
>>>>>>> web.configのconnectionStringsを以下の用に変更する事により取得出来るようになりましたが
>>>>>>> これは仕様でしょうか?
>>>>>>>
>>>>>>> ----- web.config -----
>>>>>>> <configuration>
>>>>>>>  <!-- 略 -->
>>>>>>>
>>>>>>>  <!-- Seasar.Quill -->
>>>>>>>  <quill>
>>>>>>>    <assemblys>
>>>>>>>      <assembly>System.Data.OracleClient, version=1.0.5000.0,
>>>>>>> Culture=neutral, PublicKeyToken=b77a5c561934e089</assembly>
>>>>>>>    </assemblys>
>>>>>>>  </quill>
>>>>>>>
>>>>>>>  <!-- Seasar -->
>>>>>>>  <seasar>
>>>>>>>    <assemblys>
>>>>>>>      <configPath>App.dicon</configPath>
>>>>>>>    </assemblys>
>>>>>>>  </seasar>
>>>>>>>
>>>>>>>  <appSettings/>
>>>>>>>
>>>>>>>  <connectionStrings>
>>>>>>>    <remove name ="LocalSqlServer"/>
>>>>>>>  </connectionStrings>
>>>>>>>
>>>>>>>  <!-- 略 -->
>>>>>>> </configuration>
>>>>>>> _______________________________________________
>>>>>>> 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
>


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