[Seasar-user:21797] Re: java.lang.LinkageError について(続き)

Hiroyuki Ohnaka [E-MAIL ADDRESS DELETED]
2014年 2月 18日 (火) 23:25:28 JST


大中です。

コミッタ間で検討したのですが、

(1)この同期の漏れは、複数のDaoの初回呼び出しがかぶった時に、
初期化が並列で走るようにするためのものであり、意図的であること。

(2)仮に同期をとるようにした場合、複数のdaoの初回呼び出しが直列で
走ることになり、パフォーマンスおよび互換性に影響がある変更であること。

(3)この不具合は、S2Daoのdao.diconのデフォルト設定では発生しないこと。
  (Entityをシリアライズした時に不具合があることから、デフォルト設定を
変更した経緯があります)

上記の理由から、まずは以下のワークアラウンドを試してもらうのが
いいのではないかという結論になりました。

(案その1)
dao.diconに、以下の記述があると思います。
以下のように、記述を修正してください。
<component class=“org.seasar.dao.impl.BeanEnhancerImpl” />
↓
<component class="org.seasar.dao.impl.NullBeanEnhancer”/>

ただし、この対応は、entityにgetModifiedPropertyNamesメソッドを
実装しないで、updateModifiedOnly(setterが呼ばれたプロパティのみをupdateする機能)
を使っている場合は使用できません。

(案その2)
org.seasar.dao.impl.DaoMetaDataFactoryImplを継承したクラスを作り、

protected DaoMetaData createDaoMetaData(final Class daoClass)

メソッドをオーバライドしてsynchronizedにする。

その後、dao.diconの
<component class="org.seasar.dao.impl.DaoMetaDataFactoryImpl"/>
の部分を継承したクラスに差し替えてください。

お手数おかけしますが、よろしくお願いします。


On Fri, 14 Feb 2014 22:41:33 +0900
t-ohtani @ kip.co.jp wrote:

> 大谷です。
> 
> 小林さん、大中さん、ご確認いただきありがとうございました。
> 
> 使用しているS2Daoのバージョンは、1.0.47です。
> 
> よろしくお願いいたします。
> 
> 
> 
> 送信元:	Hiroyuki Ohnaka <azusa @ fieldnotes.jp>
> 宛先:	seasar-user @ ml.seasar.org,
> 日付:	2014/02/14 21:05
> 件名:	[Seasar-user:21794] Re: java.lang.LinkageError について(続き)
> 送信者:	seasar-user-bounces @ ml.seasar.org
> 
> 
> 
> 大中です。
> 
> S2Daoの初期化は、Daoのメソッドが最初に呼ばれた時に行うのですが、
> 初期化の最中にスレッド間の排他が外れるタイミングがあり、
> この時に初期化が並行で走っているようです。
> 
> コミッタ間で確認しますが、おそらく不具合なので修正したいと思いますが、
> 大谷さんのお使いのS2Daoのバージョンはいくつでしょうか?
> 
> 
> On Fri, 14 Feb 2014 14:35:14 +0900
> Koichi Kobayashi <koichik @ gmail.com> wrote:
> 
> > 小林 (koichik) です。
> >
> > S2コンテナの初期化時ではなく、HTTPリクエストの受信時に
> > AOPを適用した動的クラス生成が行われていますね。
> >
> > S2コンテナの初期化時に動的クラス生成が行われるように
> > することで、この問題の解決および初回リクエスト時の
> > パフォーマンスが改善されるのではないかと思います。
> >
> > 具体的な方法はS2Daoに詳しい人お願いします。
> > BeanEnhancer (バージョン排他とかModifiedOnlyをサポート
> > するもの) をコンテナ初期化時に適用する方法です。
> >
> >
> >
> > 2014年2月14日 13:14 <t-ohtani @ kip.co.jp>:
> >
> > >
> > > お世話になっています。
> > > 大谷と申します。
> > >
> > > S2を大変便利に使用させていただいています。ありがとうございます。
> > >
> > >
> > > 私は、S2を使用した業務パッケージの保守を行っています。
> > >
> > > 以前、こちらのメーリングリストに以下の投稿をさせていただきました。
> > > [Seasar-user:20472] java.lang.LinkageError について
> > >
> > > 今回の投稿は、この件の続きです。
> > >
> > >
> > > 先日、あるユーザで再度「java.lang.LinkageError」が発生しました。
> > >
> > >
> > > 以前の投稿の際は、
> > >
> > > AOPでクラス名が重複することはまず無い。以下に該当しているのでは?
> > > https://issues.apache.org/bugzilla/show_bug.cgi?id=44041
> > >
> > > というご回答をいただきました。
> > >
> > > このため、現象が発生した環境を確認しましたところ、
> > > 上記URLに該当する以下のパッチが適用されていました。
> > >
> > > * [中:2100028]
> > >       初回リクエストにおいて、複数のスレッドから同時に同じクラスのロー
> ドが
> > > 行
> > >       われると、java.lang.LinkageErrorが発生し、クラスのロードに失敗す
> る場
> > > 合
> > >       がある。
> > >
> > >
> > > 現象の発生頻度は、正確には把握しておりませんが、半年に数回程度という感
> 触で
> > > す。
> > > 現象は、単一ユーザだけでなくいくつかのユーザーで発生しています。
> > > (ユーザーの総数は200程度あります。)
> > >
> > > あるユーザーでは、負荷テストで端末25台から一斉にリクエストを行った際
> に、
> > > 一台だけこの現象が発生したということです。
> > >
> > > 現象発生時のログを添付させていただきます。
> > >
> > > お手数ですが、今一度ご確認いただけませんでしょうか?
> > >
> > > (See attached file: 現象.zip)
> > >
> > > 以上、よろしくお願いいたします。
> > > _______________________________________________
> > > Seasar-user mailing list
> > > Seasar-user @ ml.seasar.org
> > > https://ml.seasar.org/mailman/listinfo/seasar-user
> > >
> > >
> >
> >
> > --
> > <signature>
> >     <name>Koichi Kobayashi</name>
> >     <e-mail>koichik @ gmail.com</e-mail>
> > </signature>
> 
> 
> --
> azusa @ gmail <azusa @ fieldnotes.jp>
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user
> 
> 
> _______________________________________________
> Seasar-user mailing list
> Seasar-user @ ml.seasar.org
> https://ml.seasar.org/mailman/listinfo/seasar-user



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