2010-01-01 64 views
6

以下Hibernate文档状态:nhibernate连接释放模式:为什么文档建议使用“after_transaction”?

hibernate.connection.release_mode配置参数用于指定要使用的释放模式。可能的值: * auto(默认值) - 相当于当前版本中的after_transaction。由于此设置的值导致故障倾向于指示用户代码中的错误和/或无效假设,因此更改此默认行为几乎不是一个好主意。 * on_close - 表示使用ConnectionReleaseMode.OnClose。这个设置是为了向后兼容,但是它的使用是非常不鼓励的。 ...

我创建了一个集成测试,通过在同一时间打开两个会话并操作相同的实体来引发StaleObjectException。为确保测试在完成时回滚所有内容,测试内容将放置在TransactionScope中;这会导致分布式事务引入,因为两个会话将针对相同的环境事务打开数据库连接。我想将默认的ConnectionReleaseMode设置更改为“OnClose”,但如上所述,文档不建议这样做。任何人都可以解释为什么改变默认行为不是一个好主意吗?

+0

为什么使用手动交易范围而不是nhibernate方式来管理交易? – Paco 2010-01-01 18:00:18

+0

我的UnitOfWork以nhibernate方式处理事务。如果我在测试中使用单个会话(因为那样我无法获得同一个实体的两个实例),我无法激发StaleObjectStateException。无论如何,这是不言而喻的。 – Marius 2010-01-02 05:52:37

+0

我还不能回答你的问题,但我想知道更多关于这个问题的内容,因为我期望在我正在进行的项目中有类似的问题。你如何创建你的ISession实例? – Paco 2010-01-02 22:34:07

回答

5

好吧,因为没有人会困扰我会尝试自己回答这个问题:-)如果你使用一个模式来处理会话时提交事务(一个事务=一个会话),你可以使用“ OnClose“发布模式。如果您在会话跨多个事务时使用模式(例如,每个业务事务的对话为http://dotnetchris.wordpress.com/2009/01/27/conversation-per-business-transaction-using-postsharp-and-ioc/),则使用“OnClose”会占用不相关的资源,因为您在提交事务时未释放与连接池的连接。默认的“after_transaction”发布模式将在提交事务时释放连接,从而释放宝贵的数据库连接。

相关问题