3.0.0.RC1を使用したSpring DAOの同時実行性の問題
-
05-07-2019 - |
質問
Spring 3.0.0.M4から3.0.0.RC1およびSpring Security 3.0.0.M2から3.0.0.RC1にアップグレードした後、定義する代わりにsecurity:authentication-managerタグを使用する必要がありました。 M4 / M2で使用した_authenticationManager私はそれを定義することに最善を尽くし、これで終わった:
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider user-service-ref="userService">
<security:password-encoder hash="plaintext"/>
</security:authentication-provider>
</security:authentication-manager>
ユニットテストを一度に1つずつ行うと、これはうまく機能し、ほとんどのAJAXリクエストでも問題なく動作しますが、一見ランダムに見えるので、データベースセッションが途中で閉じられるような奇妙なエラーが発生します作品。これらのエラーを引き起こす方法は、同じクライアントから異なるコントローラーに多くの異なるAJAXリクエストを送信するだけで、そのうち少なくとも1つがランダムに失敗します。次回試してみると、1つは動作し、もう1つは失敗します。
このエラーは、私のuserDAOで最も頻繁に発生しますが、他のDAOSでも非常に頻繁に発生します。例外には、少なくとも以下が含まれます:
- &quot; java.sql.SQLException:ResultSetを閉じた後の操作は許可されません&quot;
- &quot; org.hibernate.impl.AbstractSessionImpl:errorIfClosed():セッションは閉じられました!&quot;
- &quot; java.lang.NullPointerException at com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2439)&quot;
- &quot; java.util.LinkedHashMap $ LinkedHashIterator.nextEntry(Unknown Source)&quot;でのjava.util.ConcurrentModificationException
- &quot; org.hibernate.LazyInitializationException:コレクションのロードへの不正アクセス&quot;
- etc ...
以前は、_authenticationManager Beanを定義していましたが、同じリクエストがチャームのように機能していました。しかし、RC1では、これを定義することはできなくなりました。以前は次のようでした。
<bean id="_authenticationManager" class="org.springframework.security.authentication.ProviderManager">
<property name="providers">
<list>
<bean class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<property name="userDetailsService" ref="userService"/>
<property name="passwordEncoder">
<bean class="org.springframework.security.authentication.encoding.PlaintextPasswordEncoder" />
</property>
</bean>
</list>
</property>
</bean>
同じクライアントからの複数のリクエストのトランザクションを共有するように、security:authentication-managerを誤って定義しましたか?別に定義する必要がありますか、それとも他のセキュリティを定義する必要があります:Bean?
データベースセッションを閉じるために誤解しているものはありますか?私の頭の中では、各リクエストには独自のデータベース接続とトランザクションがあります。すべてのゲッターとセッターは同期化されたメソッドであるため、並行性の問題は実際にはありません。 UIがリクエストを行うRESTコントローラーはすべてGETリクエストであり、読み取り専用の作業を行います。私の知る限り、これらのリクエスト中に単一のINSERT / UPDATE / DELETEが実行されることはありません。データベースログを調べてこれを確認しました。
これらの競合状態を回避する方法についてのご意見をお待ちしています。
乾杯
Nik
PS、私は問題がsecurity:authentication-managerにあることをより具体的にするために質問を更新しました(または、もしあなたがそれが素晴らしい何か他のものであり得るというヒントを持っているなら、私にはそうです) 3.0.0.RC1以降の独自の_authenticationManagerの代わりに使用することを余儀なくされていること
PPS、ここに私が_authenticationManagerを定義できなくなったことを理解させたスレッドがあります: SpringSourceフォーラムの投稿
解決
DAOでのデータベースセッションの処理に大きな問題があったようですので、私の問題をまとめて、ここで別のスレッドにソリューションをStackOverflow に投稿し、ソリューションに関する人々の意見を求めました。問題が増えないことを願っています:-)
乾杯
Nik