论坛首页 Java企业应用论坛

有人真正测试过spring事务中readonly吗

浏览 18803 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-23  
By setting the JDBC connection to read-only, Spring prevents a distracted user from persisting changes by flushing the Hibernate session to the database.

0 请登录后投票
   发表时间:2009-07-23   最后修改:2009-07-23
1.readonly语义不是所有的数据库驱动都支持的。
2.在spring+hibernate的条件下,readonly有一些优化
http://www.iteye.com/topic/95124
0 请登录后投票
   发表时间:2009-07-24  
ahuaxuan 写道
1.readonly语义不是所有的数据库驱动都支持的。
2.在spring+hibernate的条件下,readonly有一些优化
http://www.iteye.com/topic/95124

说的没错, 有的数据库驱动是不支持readonly的。但在oracle下绝对支持,上面也已经验证过了。
顺便回答下你帖子里一个问题: 使用jdbc不但没有优化,压根jdbc的这个DataSourceTransactionManager就不支持readonly。因为它源代码里面没有一处调用con.setReadOnly(true)之类的方法。
而HibernateTransactionManager中正如你所说的会有这么一段:
if (definition.isReadOnly() && txObject.isNewSession()) {
                                // Just set to NEVER in case of a new Session for this transaction.
                                session.setFlushMode(FlushMode.NEVER);
                        }


详细分析: http://www.iteye.com/problems/10624
0 请登录后投票
   发表时间:2009-07-26  
geng2483759 写道
ahuaxuan 写道
1.readonly语义不是所有的数据库驱动都支持的。
2.在spring+hibernate的条件下,readonly有一些优化
http://www.iteye.com/topic/95124

说的没错, 有的数据库驱动是不支持readonly的。但在oracle下绝对支持,上面也已经验证过了。
顺便回答下你帖子里一个问题: 使用jdbc不但没有优化,压根jdbc的这个DataSourceTransactionManager就不支持readonly。因为它源代码里面没有一处调用con.setReadOnly(true)之类的方法。
而HibernateTransactionManager中正如你所说的会有这么一段:
if (definition.isReadOnly() && txObject.isNewSession()) {
                                // Just set to NEVER in case of a new Session for this transaction.
                                session.setFlushMode(FlushMode.NEVER);
                        }


详细分析: http://www.iteye.com/problems/10624

这位同学,你最好修改一下你的结论,DataSourceTransactionManager不是不设置readonly,只是你没有看到,DataSourceTransactionManager#doBegin()方法中有这么一句:Integer previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition);,你跟进去看看会发现:


public static Integer prepareConnectionForTransaction(Connection con, TransactionDefinition definition)
			throws SQLException {

		Assert.notNull(con, "No Connection specified");

		// Set read-only flag.
		if (definition != null && definition.isReadOnly()) {
			try {
				if (logger.isDebugEnabled()) {
					logger.debug("Setting JDBC Connection [" + con + "] read-only");
				}
				con.setReadOnly(true);
			}
			catch (Throwable ex) {
				// SQLException or UnsupportedOperationException
				// -> ignore, it's just a hint anyway.
				logger.debug("Could not set JDBC Connection read-only", ex);
			}
		}

		。。。。。。。。。。。。。。。。。
	}


所以即使是spring+jdbc还是会设置readonly的
7 请登录后投票
   发表时间:2009-07-27  
ahuaxuan 写道
1.readonly语义不是所有的数据库驱动都支持的。
2.在spring+hibernate的条件下,readonly有一些优化
http://www.iteye.com/topic/95124

是的

有些数据库驱动不支持readonly的

像我就从来都没能用上readonly
0 请登录后投票
   发表时间:2009-07-27  
是通过数据库的事务控制实现的,spring只是把事务控制的参数传给jdbc而已。
关于测试的问题,完全可以通过多线程模拟出来,模拟测试+源码研究
0 请登录后投票
   发表时间:2009-07-27   最后修改:2009-07-27
READ ONLY是需要底层数据库支持的! 至少MySQL中没有问题
1 请登录后投票
   发表时间:2009-08-06  
ahuaxuan 说的没错,的确是设置了,但readonly还是不起作用,最新测试结果看我正文中的修改。
0 请登录后投票
   发表时间:2009-08-08  
  1. readonly并不是所有数据库都支持的,不同的数据库下会有不同的结果。
  2. 设置了readonly后,connection都会被赋予readonly,效果取决于数据库的实现。
  3. 在ORM中,设置了readonly会赋予一些额外的优化,例如在Hibernate中,会被禁止flush等。
0 请登录后投票
   发表时间:2009-08-08  
gates_lee 写道
  1. readonly并不是所有数据库都支持的,不同的数据库下会有不同的结果。
  2. 设置了readonly后,connection都会被赋予readonly,效果取决于数据库的实现。
  3. 在ORM中,设置了readonly会赋予一些额外的优化,例如在Hibernate中,会被禁止flush等。

oracle在odbc14的jar下是绝对支持readonly的,这点吾容置疑。但为何会出现我文中所说的现象,这才是本质问题。

0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics