我正在尝试为Spring / Hibernate应用程序找到一个好的设计。在创建这样的应用程序时,似乎有一些重大决定。
第一个主要决定似乎是放置会话/事务边界的位置。看起来我有三个主要选择:作为控制器甚至调用之前的过滤器,紧接在服务调用级别的控制器之下,并且在存储库调用中的业务级别之下填充。
在我看来,正确的呼叫是中间路径,但我不确定。我不希望我的事务打开太长时间,但同时,我不想经常担心业务逻辑中的分离对象和延迟加载。不过,还有一些缺点。例如,它使业务逻辑很难在没有暂停事务几秒钟的情况下进行远程调用。我想知道是否有更好的方法?
答案 0 :(得分:1)
这取决于你如何模块化代码。我假设您没有在控制器中编写所有与数据库事务相关的代码。如果您已将代码分离到处理事务的DAO或服务层,那么只有所需的粒度才有意义。
长时间保持交易占用并不是一个好的设计,因此让过滤器打开会话可能是一个坏主意。除非,您有一些您希望打开会话的延迟加载对象。
如果上述内容不适用,那么您只能在数据访问层周围设置事务/会话边界。
答案 1 :(得分:1)
除非您的dao方法包含业务逻辑,否则将事务限制为dao调用是没有意义的。这就是接近“自动提交”模式的方式,我觉得这很有用。
在任何情况下,如果您希望保持简短的交易,我建议您密切关注每个业务用例的“sql足迹”(通过将org.hibernate.SQL日志类别设置为DEBUG)并比较生成的sql你自己写的东西。
大多数时候我看到慢用例,这是因为hibernate延迟加载功能没有正确配置(它太急切了,在每个查询中添加了12个级别的连接,或者太懒,发出查询收藏元素)