[Seasar-user:16205] Re: [S2JPA] PersistenceUnitInfoFactoryImplのDEFAULT_DATASOURCE
Akira Asakawa
[E-MAIL ADDRESS DELETED]
2008年 11月 1日 (土) 23:09:06 JST
淺川です。
ご回答ありがとうございます。
Koichi Kobayashi さんは書きました:
> 小林 (koichik) です.
>
> Date: Sat, 01 Nov 2008 19:45:04 +0900
> From: Akira Asakawa <[E-MAIL ADDRESS DELETED]>
> To: [E-MAIL ADDRESS DELETED]
> Subject: [Seasar-user:16203] [S2JPA] PersistenceUnitInfoFactoryImplのDEFAULT_DATASOURCE
>
>
>> 淺川と申します。
>>
>> org.seasar.framework.jpa.impl.PersistenceUnitInfoFactoryImplから
>> PersistenceUnitInfoを作成すると、persistence.xml中で
>> <jta-data-source>と<non-jta-data-source>のどちらかを
>> 指定しなかった場合に、指定しなかった方も強制的にデフォルトの
>> jdbc/dataSourceを参照するデータソースが返されてしまいます。
>>
> (略)
>
>> JSR 220にはデフォルトのデータソースは定義されていないようですし、
>> 指定されていないデータソースはnullを返すべきだと思うのですが、
>>
>
> 「null を返すべき」と判断する材料がありません.
> getNonJtaDataSource() の戻り値については,
>
> The non-JTA-enabled data source to be used by the persistence
> provider for accessing data outside a JTA transaction.
> The data source corresponds to the named <non-jta-data-source>
> element in the persistence.xml file or provided at deployment
> or by the container.
>
> となっていて,S2 では最後の「or by the container」
> としてデフォルトのデータソースを設定しています.
> デフォルト値は PersistenceUnitInfoFactoryImpl の
> defaultNonJtaDataSource で変更できますが,現状は
> null を設定することはできません.
>
> 「null を返すべき」なら,上述のところに「or null」
> などと書いて欲しいところです.
>
>
そうですね。nullは返すべきではないかもしれません。
ただ、定義されているかわからない"jdbc/dataSource"を
固定で返すのもどうかと思います(苦肉の策なのだとは思いますが)。
GlassFishはgetJtaDataSource()に限っては非JTAの場合にnullを返します。
getNonJtaDataSource()は、指定されていない場合に<jta-data-source>で
指定されたデータソースのJTAに関連付いていないビューを返します。
>> Toplink Essentialsでは、transaction-type="JTA"の場合でも
>> <non-jta-data-source>を読み込み専用のデータソースとして使うため、
>> jdbc/dataSource以外のデータソースをpersistence.xmlで指定した場合に
>> 何の関係もないjdbc/dataSourceも使用してしまうことになります。
>>
>
> トランザクション境界外で遅延フェッチされる
> 場合とかでしょうか?
>
私が気づいたのは、platformの自動検出の際に、
read-only用のデータソースを読みに行ったからです。
調べた範囲ではこれを止めるパラメータは無さそうでした。
おそらく、現在のトランザクションに影響を与えないために
RequiresNewのような挙動で読みに行くためだと思います。
> そうであれば,<non-jta-data-source> をちゃんと
> 指定するのが筋のような気もしますが (JTA の
> トランザクション外でデータソースが使われると
> 分かっているのだから),それだと何か不都合が
> あるのでしょうか?
>
>
そちらで回避することも可能です。
それでも、TopLinkとS2JPAの組み合わせで起きる現象なので、
S2TopLink-JPAもしくはS2JPAで対応すべきだとも思うのですが、
いかがでしょうか?
Seasar-user メーリングリストの案内