使用3.0.0.RC1的Spring DAO中的并发问题

时间:2009-10-23 09:02:45

标签: java hibernate spring concurrency spring-security

从Spring 3.0.0.M4升级到3.0.0.RC1和Spring Security 3.0.0.M2升级到3.0.0.RC1后,我不得不使用security:authentication-manager标签而不是定义一个_authenticationManager就像我以前在M4 / M2中一样。我已经尽力定义它,并最终得到了这个:

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

当我一次一个地进行单元测试时,这很好用,对于大多数AJAX请求它​​也可以正常工作,但看似随机,我在我的交易中出现奇怪的错误,我的数据库会话似乎在中途关闭工作。我可以引发这些错误的方法就是从同一个客户端向我的不同控制器发送大量不同的AJAX请求,然后其中至少有一个会随机失败。下次我尝试时,那个会工作而另一个会失败。

错误最常发生在我的userDAO中,但在其他DAOS中也经常发生,例外情况至少包括以下内容:

  • “java.sql.SQLException:ResultSet关闭后不允许操作”
  • “org.hibernate.impl.AbstractSessionImpl:errorIfClosed():会话已关闭!”
  • “com.mysql.jdbc.PreparedStatement.fillSendPacket(PreparedStatement.java:2439)中的java.lang.NullPointerException”
  • “java.util.LinkedHashMap上的java.util.ConcurrentModificationException $ LinkedHashIterator.nextEntry(未知来源)”
  • “org.hibernate.LazyInitializationException:非法访问加载集合”
  • 等...

之前,我曾经定义过一个_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>

我是否定义了我的安全性:authentication-manager错误,以便它将共享来自同一客户端的多个请求的事务?我应该以不同的方式定义它,还是应该定义其他一些安全性:bean?

我有什么误解让我的数据库会话关闭吗?在我的脑海中,每个请求都有自己的数据库连接和事务。所有getter和setter都是同步方法,所以我真的不应该有任何并发​​问题。 UI发出请求的所有REST控制器都是GET请求并执行只读工作。据我所知,在任何这些请求中都没有完成单个INSERT / UPDATE / DELETE,并且我已经检查了数据库日志以验证这一点。

我期待听到您关于如何避免这些竞争条件的建议。

干杯

的Nik

PS,我已经更新了问题,更具体地说问题在于安全性:身份验证管理器(或者在我看来,如果你有提示它可能是其他更好的东西)我被迫使用而不是我自己的_authenticationManager,从3.0.0.RC1开始

PPS,这是让我明白我无法再定义_authenticationManager的线程:SpringSource Forum Post

1 个答案:

答案 0 :(得分:0)

我的DAO中的数据库会话处理似乎有一个大问题,所以我做了write-up of my problem and posted the solution in another thread here at StackOverflow并询问了人们对解决方案的看法。我希望它不会给出更多问题: - )

干杯

的Nik