Spring supports the concept of read-only transactions. Because Spring doesn’t provide persistence functionality itself, the semantics of read-only transactions depend on the underlying persistence framework used along with Spring.
I use Spring with Hibernate and Oracle, and when I looked to understand the semantics of read-only transactions on this specific configuration, I found that there was very little information on the web. The existing information is scarce and not very clear, and as a result I had to do some research myself, which included hacking into Spring and Hibernate’s source code. Not that I don’t enjoy spending a few late hours reading good code, but so that you don’t have to do it yourself, here is what I found.
Spring
Spring’s documentation doesn’t say almost anything about what a read-only transaction really means. The best information I could find was:
Read-only status: a read-only transaction does not modify any data. Read-only transactions can be a useful optimization in some cases (such as when using Hibernate).
That’s basically all it says. Google and a little hacking shed some light on the real meaning of the sentence above: if the transaction is marked as read-only, Spring will set the Hibernate Session’s flush mode to FLUSH_NEVER, and will set the JDBC transaction to read-only. Now lets understand what it means and what are the implications in a Hibernate/Oracle setup.
Hibernate
Hibernate doesn’t have the concept of read-only sessions. But when a session’s flush mode is set to FLUSH_NEVER, which is what Spring does, two interesting things happen. First, running HQL queries no longer cause Hibernate to flush the session state to the database, which can provide a dramatic performance improvement. Secondly, Hibernate will not flush the changes before commiting the transaction. But the user can still call Session.flush() by hand, causing any modifications to be persisted to database. This is where Spring’s call to Connection.setReadOnly() comes handy.
Oracle
When using the Oracle JDBC driver, calling connection.setReadOnly(true) translates into the statement “SET TRANSACTION READ ONLY”. This statement limits the types of SQL statements that can be executed during the transaction. Only SELECTS (without ‘FOR UPDATE’) and a few other statements can be executed. Specifically, no UPDATEs, DELETEs, INSERTs or MERGEs can be executed. This behavior is Oracle-specific. Other RDBMS can have different semantics for read only transactions or simply not support it at all.
By setting the JDBC connection to read-only, Spring prevents a distracted user from persisting changes by flushing the Hibernate session to the database.
Notes
As we saw, with the two measures taken by Spring, the transaction is guaranteed to be read-only through the JDBC connection, and performance improvements are obtained by setting the Hibernate session to FLUSH_NEVER.
There is one thing that doesn’t happen, though. Even during Spring read-only transactions, Hibernate queries still save the state of persistent objects in the session cache. In theory it wouldn’t be necessary, since this state is used to detect modifications during session flushes. Depeding on the size and number of objects it can make a huge difference in terms of memory usage.
If you still want to prevent Hibernate from saving the object state in the session cache, you have to manually run the HQL queries in read-only mode. It would be a nice improvement to Hibernate to have a read-only mode to the session so that no object state is stored and no flush executed
分享到:
相关推荐
struts-spring-hibernate-_-integration-2.zip
spring-hibernate.jar
spring4-mvc-hibernate4成功
spring-mybatis-hibernate-jar包
spring.jar spring-aop.jar spring-aop.jar spring-beans.jar spring-hibernate3.jar spring-jdbc.jar spring-struts.jar spring-web.jar
搭建SpringMVC spring hibernate 实现项目登录注册 增删查改以及分页查询 代码简洁明了,其中需要自己先建Mysql数据库,数据表 后台通过hibernate自动生成。
Struts-spring-Hibernate.Struts-spring-Hibernate.Struts-spring-Hibernate.
该demo是一个Spring-SpringMVC-Hibernate在maven下的整合。不是太难吧!都能看懂!
spring-boot-hibernate5 整合源码
Java-Spring+Struts+Hibernate-SSH框架整合01-Spring+Hibernate(一步一步的教你敲代码)(博客园,博客名称:Java-Spring+Struts+Hibernate-SSH框架整合01-Spring+Hibernate)
Java J2EE Hibernate Struts Spring Hibernate Together
Struts 2.3.25 + spring-4.2.2 + hibernate-5.0.2 Apache Struts Struts 2.3.24.1 has been released on 24 september 2015. http://struts.apache.org/download.cgi#struts23241 spring-framework-4.2.2.RELEASE-...
Spring-MVC-Hibernate-CRUD-源码.rar
基于maven的spring4-mvc-hibernate4空框架,解压导入maven项目即可,亲测可用
struts-2.5.1-spring-4.2.7-hibernate-5.0.9 整合的项目 可以直接用 . spring 4.3 + hibernate 5.0 测试不可用 冲头
项目实践精解:基于Struts-Spring-Hibernate的Java应用开发 项目开发全过程 Java项目实战
spring-struts2-hibernate-maven整合,spring+struts2+hibernate在maven下的简单整合,直接导入ide即可使用
spring-orm-hibernate4源码,可以直接导入Eclipse工程下面!
本人的此jar合集只能保证SSH2的基础环境,至于更复杂的功能,可能此集合已经包含,或者您可以从您下载的Spring或者hibernate或者struts中寻找您需要的jar包,按要求添加即可。 【因本人能力有限,不能保证此jar集合...
struts-spring-hibernate整合教程