2010-04-01 228 views
23

只需要您对Spring的声明式交易管理的专家意见。这里是我的设置:春季 - 只读交易

  1. DAO层是普通的旧JDBC使用Spring的JdbcTemplate(无休眠等)
  2. 服务层是POJO与声明式事务如下 - save*, readonly = false, rollback for Throwable

事情很好地工作以上设置。但是,当我说get*, readonly = true时,我在我的日志文件中看到错误,说Database connection cannot be marked as readonly。这发生在服务层的所有get *方法中。

现在我的问题是:

A.我必须设置get*为只读?我所有的get*方法都是纯读取数据库操作。我不希望在任何事务环境中运行它们。上述错误有多严重?

B.当我删除get*配置时,我看不到错误。另外,我所有的简单的get*操作都是在没有事务的情况下执行的。这是要走的路吗?

C.为什么任何人想要有交易方法readonly = true?这个配置有什么实际意义吗?

谢谢!一如既往,您的反应非常感谢!

回答

23

This post说明行为或readOnly标志是持久性机制相关的。

C.是,使用Hibernate时,通过冲洗模式设置为FLUSH_NEVER(如链接后述)

B.是,JDBC调用不需要交易提供了性能优势(休眠需要一个),因此删除@Transactional配置会修整所有事务管理。

A.我认为春天是调用connection.setReadOnly(true)但你的JDBC驱动程序不支持此

的底线是:不使用readonly交易与普通的JDBC。

而另一件事 - 交易应该跨越多个查询。不要让你的交易过于细化。让他们a unit of work

+0

谢谢Bozho!当天清除。我想我将使用普通JDBC删除get *配置。 – AAK 2010-04-01 20:19:09

+1

如果没有只读事务,您也可以打开自己的'org.hibernate.LazyInitializationException'。 – HDave 2014-11-12 21:15:10

+0

以何种方式可以避免org.hibernate.LazyInitializationException,同时起诉waffle身份验证管理器。 – 2015-08-27 13:53:19

5

答:我必须说*获取只读吗?我所有的get *方法都是纯读取数据库操作。我不希望在任何事务环境中运行它们。上述错误有多严重?

实际上,您可能仍然希望在事务上下文中运行所有的get(),以确保您获得一致的读取。另一方面,如果您不关心这一点,则可以相应地设置交易级别。

C.为什么任何人想要事务性方法readonly = true?这个配置有什么实际意义吗?

  1. 为了帮助防止错误的写GET内()`方法
  2. 为了优化目的。正如Bozho提到的,Hibernate不仅可以使用这些信息,还可以使用一些数据库/ JDBC驱动程序来使用这些信息。
+0

谢谢你马特!我想我的get *方法非常简单,独立的SQL select查询,我没有使用Hibernate,所以我会关闭设置。 – AAK 2010-04-01 20:20:23