精华帖 (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.
|
|
返回顶楼 | |
发表时间:2009-07-23
最后修改:2009-07-23
|
|
返回顶楼 | |
发表时间:2009-07-24
ahuaxuan 写道
说的没错, 有的数据库驱动是不支持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 |
|
返回顶楼 | |
发表时间:2009-07-26
geng2483759 写道 ahuaxuan 写道
说的没错, 有的数据库驱动是不支持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的 |
|
返回顶楼 | |
发表时间:2009-07-27
ahuaxuan 写道
是的 有些数据库驱动不支持readonly的 像我就从来都没能用上readonly |
|
返回顶楼 | |
发表时间:2009-07-27
是通过数据库的事务控制实现的,spring只是把事务控制的参数传给jdbc而已。
关于测试的问题,完全可以通过多线程模拟出来,模拟测试+源码研究 |
|
返回顶楼 | |
发表时间:2009-07-27
最后修改:2009-07-27
READ ONLY是需要底层数据库支持的! 至少MySQL中没有问题
|
|
返回顶楼 | |
发表时间:2009-08-06
ahuaxuan 说的没错,的确是设置了,但readonly还是不起作用,最新测试结果看我正文中的修改。
|
|
返回顶楼 | |
发表时间:2009-08-08
|
|
返回顶楼 | |
发表时间:2009-08-08
gates_lee 写道
oracle在odbc14的jar下是绝对支持readonly的,这点吾容置疑。但为何会出现我文中所说的现象,这才是本质问题。 |
|
返回顶楼 | |