2009-10-23 6 views
1

Après la mise à niveau de Spring 3.0.0.M4 à 3.0.0.RC1 et Spring Security 3.0.0.M2 à 3.0.0.RC1, j'ai dû utiliser une sécurité: balise authentication-manager au lieu de définir un _authenticationManager comme je le faisais dans M4/M2. Je l'ai fait de mon mieux à définir, et a fini avec ceci:Problèmes de simultanéité dans DAO de Spring avec 3.0.0.RC1

<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider user-service-ref="userService"> 
    <security:password-encoder hash="plaintext"/> 
    </security:authentication-provider> 
</security:authentication-manager> 

Quand je fais mon unité teste un à la fois, cela fonctionne très bien, et pour la plupart AJAX demande cela fonctionne bien aussi, mais apparemment de manière aléatoire, je reçois des erreurs bizarres dans mes transactions où ma session de base de données semble se fermer à mi-chemin dans le travail. La façon dont je peux provoquer ces erreurs est juste envoyer beaucoup de différentes demandes AJAX à mes différents contrôleurs du même client, alors au moins l'un d'eux échouera au hasard. La prochaine fois que j'essaierai, celle-ci fonctionnera et une autre échouera.

L'erreur se produit le plus souvent dans mon userDAO, mais aussi assez souvent dans d'autres taos et les exceptions comprennent au moins les éléments suivants:

  • « java.sql.SQLException: Opération non autorisée après ResultSet fermé »
  • "org.hibernate.impl.AbstractSessionImpl: errorIfClosed(): La session est fermée!"
  • "java.lang.NullPointerException à com.mysql.jdbc.PreparedStatement.fillSendPacket (PreparedStatement.java:2439)"
  • « java.util.ConcurrentModificationException à java.util.LinkedHashMap $ LinkedHashIterator.nextEntry (Source inconnue) "
  • "org.hibernate.LazyInitializationException: accès illégal à la collecte de chargement"
  • etc ...

Avant, je définir un grain de _authenticationManager, et les mêmes demandes a fonctionné comme un charme. Mais avec RC1, je ne suis plus autorisé à le définir. Il sert à ressembler à ceci:

<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> 

Ai-je défini ma sécurité:-gestionnaire d'authentification correctement afin qu'il partagera les transactions pour de multiples demandes du même client? Devrais-je le définir différemment, ou devrais-je définir d'autres types de sécurité: les haricots?

Y at-il quelque chose que j'ai mal compris qui rend mes sessions de base de données plus proches? Dans ma tête, chaque requête a sa propre connexion et transaction de base de données. Tous les getters et setters sont des méthodes synchronisées, donc je ne devrais vraiment pas avoir de problèmes de simultanéité. Tous les contrôleurs REST auxquels l'interface utilisateur fait appel sont des requêtes GET et effectuent un travail en lecture seule. À ma connaissance, pas un seul INSERT/UPDATE/DELETE est fait au cours de l'une de ces demandes, et j'ai inspecté les journaux de la base de données pour le vérifier.

J'ai hâte d'entendre vos suggestions sur la façon d'éviter ces conditions de course.

Vive

Nik

PS, mon retour, j'ai mis à jour la question d'être plus précis que le problème est avec la sécurité:-gestionnaire d'authentification (ou alors il me semble, si vous avez des conseils cela pourrait être quelque chose d'autre qui serait génial) que je suis obligé d'utiliser à la place de mon propre _authenticationManager en commençant par 3.0.0.RC1

PPS, voici le fil qui m'a fait comprendre que je ne pouvais fait plus définir une _authenticationManager: SpringSource Forum Post

+0

Avez-vous essayé la mise à niveau juste un de la sécurité printemps et printemps, plutôt que les deux en même temps? De cette façon, vous sauriez au moins lequel était à l'origine du problème. – skaffman

+0

Bonjour, Skaffman, et merci de me répondre. :-) Avec RC1, j'ai dû passer du bean _authenticationManager à l'utilisation de la sécurité: authentication-manager. Si je reviens et utilise à nouveau le _authenticationManager, tout va bien. Si je retourne à M4 mais utilise le security: authentication-manager, j'obtiens les mêmes erreurs qu'avec RC1. Alors peut-être que je devrais avoir formulé ma question: en utilisant la sécurité: gestionnaire d'authentification comme requis dans RC1, pourquoi ai-je ce qui semble être des problèmes de concurrence, comme indiqué ci-dessus? Salutations -Nik – niklassaers

+0

Donc, dites-vous que vous obtenez le même problème avec Spring Security 3.0.0.RC1 et Spring 3.0.0.M4? Si oui, alors le problème semblerait reposer fermement sur Spring Security 3.0.0.RC1, pas avec Spring core. – skaffman

Répondre

Questions connexes