org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode


[spring]:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode

org.springframework.dao.InvalidDataAccessApiUsageException: Write

operations are not allowed in read-only mode

(FlushMode.NEVER/MANUAL): Turn your Session into

FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction

definition.

 at

org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOper

ationAllowed(HibernateTemplate.java:1095)

 

這個異常產生的主要原因是DAO采用了Spring容器的事務管理策略,如果操作方法的名稱和事務策略中指定的被管理的名稱不能夠匹配上,spring 就會采取默認的事務管理策略(PROPAGATION_REQUIRED,read only).如果是插入和修改操作,就不被允許的,所以報這個異常

查看spring中事務管理配置:

<bean id="txProxyTemplate" abstract="true"

  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

  <property name="transactionManager">

   <ref bean="transactionManager" />

  </property>

  <property name="transactionAttributes">

   <props>

    <prop key="find*">PROPAGATION_REQUIRED</prop>

    <prop key="save*">PROPAGATION_REQUIRED</prop>

    <prop key="remove*">PROPAGATION_REQUIRED</prop>

    <prop key="update*">PROPAGATION_REQUIRED</prop>

    <prop key="create*">PROPAGATION_REQUIRED</prop>

    <prop key="add*">PROPAGATION_REQUIRED</prop>

    <prop key="del*">PROPAGATION_REQUIRED</prop>

    <prop key="clear*">PROPAGATION_REQUIRED</prop>

    <prop key="build*">PROPAGATION_REQUIRED</prop>

   </props>

  </property>

 </bean>

看了之后才知道,原來的事務策略的<prop key="*">PROPAGATION_REQUIRED</prop>被刪除后,bumenAuth()方法后忘了修改,所以導致報上述的錯誤

修改方法一:

     將此方法修改為update或者build,add....等上述策略名稱開頭的方法:如:updateBumenAuth()

修改方法二:

    增加<prop key="*">PROPAGATION_REQUIRED</prop>即可

修改方法三:

 將web.xml下的

   <filter>

  <filter-name>OpenSessionInViewFilter</filter-name>

  <filter-class>

   org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

  </filter-class>

  <init-param>

   <param-name>singleSession</param-name>

   <param-value>true</param-value>

  </init-param>

 </filter>

中 的singleSession值修改為false,即不限制整個過程用同一個session,但缺點是Hibernate Session的Instance可能會大增,使用的JDBC Connection量也會大增,如果Connection Pool的maxPoolSize設得太小,很容易就出問題

參考:關於OpenSessionView(http://liuwei1578.blog.163.com/blog/static/4958036420092104215514/)

Spring事務配置TransactionProxyFactoryBean(http://liuwei1578.blog.163.com/blog/static/49580364200921041136625/)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM