Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition...
时间: 2023-11-22 18:52:57 浏览: 32
这个错误通常出现在使用Spring框架进行数据库操作时,意思是当前事务为只读事务,不允许进行写操作。解决方法有两个:
1. 将当前事务的FlushMode设置为COMMIT或AUTO,这样就可以进行写操作了。可以在代码中使用以下语句设置FlushMode:
```
session.setFlushMode(FlushMode.COMMIT);
```
2. 将当前事务的readOnly属性设置为false,这样就可以进行写操作了。可以在Spring的事务定义中将readOnly属性设置为false,例如:
```
<tx:method name="update*" propagation="REQUIRED" readOnly="false"/>
```
相关问题
SpringMVC4+hibernate遇到 readOnly问题FlushMode.MANUAL
在SpringMVC4 + hibernate中,可以使用@Transactional注解来管理事务。@Transactional默认会将事务设置为读写模式,也就是说,如果你在一个只读的方法上使用@Transactional注解,那么这个方法也会被执行成写模式,这可能会引起一些不必要的性能问题。
为了避免这种情况,可以使用readOnly属性来将事务设置为只读模式。例如:
```java
@Transactional(readOnly = true)
public void myReadOnlyMethod() {
// 只读操作
}
```
另外,如果你需要在只读模式下执行查询操作,但是又想让hibernate缓存这些查询结果,可以使用FlushMode.MANUAL来禁止hibernate自动刷新缓存。例如:
```java
Session session = sessionFactory.getCurrentSession();
session.setFlushMode(FlushMode.MANUAL);
// 执行查询操作
```
这样做可以避免hibernate在查询结束后自动刷新缓存,从而提高性能。但需要注意的是,由于缓存不会自动刷新,如果你在查询之后修改了数据,那么这些修改可能不会被缓存所感知,因此需要手动刷新缓存或者重新查询。
那如果我使用的是com.mchange.v2.c3p0.ComboPooledDataSource,又该怎么写,是不是我的struts.xml文件不对导致了只读,还是用这个类就只能只读呢,这是struts.xml<context-param> <param-name>contextConfigLocation </param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <display-name>Struts2</display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <filter> <filter-name>struts2</filter-name> <filter-class> <!--2.5版本的写法 --> org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter> <filter-name>openSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class> <init-param> <param-name>flushMode</param-name> <param-value>AUTO</param-value> </init-param> <init-param><param-name>OpenSessionInViewFilter</param-name> <param-value>/*</param-value></init-param> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/* </url-pattern> </filter-mapping>
如果您使用的是com.mchange.v2.c3p0.ComboPooledDataSource,则需要在配置文件中指定连接池的读写属性。您可以参考以下示例代码:
```
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/mydatabase" />
<property name="user" value="root" />
<property name="password" value="password" />
<property name="acquireIncrement" value="5" />
<property name="minPoolSize" value="10" />
<property name="maxPoolSize" value="100" />
<property name="maxStatements" value="50" />
<property name="readOnly" value="false" />
</bean>
```
在此示例中,我们将readOnly属性设置为false,以允许对数据库进行读写操作。如果您的readOnly属性已经设置为false,那么您可以检查您的数据库用户是否具有写入权限。
另外,您的struts.xml文件中的配置看起来没有问题,不会导致只读。您可以检查您的数据库配置和权限设置来解决只读问题。