[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 メーリングリストの案内