gpt4 book ai didi

nhibernate - 查询异常后 NHibernate session 的使用

转载 作者:行者123 更新时间:2023-12-02 07:15:30 24 4
gpt4 key购买 nike

我们正在尝试实现重试逻辑以从 Azure 环境中的暂时性错误中恢复。

我们正在使用long-running sessions在应用程序事务结束时跟踪并提交全部更改(可能分布在多个 Web 请求中)。在此过程中,我们需要从数据库获取额外的数据。我们的主要问题是我们无法轻松地从数据库错误中恢复,因为我们无法“重放”所有用户操作。

到目前为止,我们使用了简单的恢复算法:

  • 尝试在长时间运行的 session 中执行操作
  • 如果出现错误,请关闭 session ,打开一个新 session 并将实体合并到其中
  • 重试该操作

就时间而言,这是非常昂贵的方法(对于大型实体层次结构来说,合并确实很长)。所以我们想稍微优化一下。

我们希望在单独的 session 中执行查询操作(以保持长时间运行不受影响且安全),并在成功后将结果合并回长时间运行的 session 。这里重试相对简单 - 我们只需要打开新 session 并再次运行查询。然而,通过这种方法,我们在初始化惰性属性/集合时遇到了问题:

  • 如果我们在单独的 session 中执行此操作,我们需要将结果合并回来(很多实体),但合并可能会失败并中断长时间运行的 session
  • 我们尝试了不同的方法将原始实体“移动”到不同的 session 、加载详细信息并将其返回,但没有成功(逐出、复制等)

已知statement如果出现异常,该 session 应该被丢弃。但是,该示例显示了写入操作。对于已读的人来说仍然如此吗?我的意思是,如果我保证没有数据写回数据库,我可以重复使用相同的 session 来再次运行查询吗?

对于长时间运行的 session 的重试逻辑,您还有其他建议吗?

最佳答案

IMO 无法解决您的问题。提交所有内容将花费大量时间,否则您将必须做大量工作将其分解为更小的 session 并处理合并时可能发生的每个错误。

回答有关在异常后使用 session 的问题:您不能再信任此 session 中的任何内容,甚至不能信任加载的实体。

阅读 Ayende 的 article 中的这段文字关于构建一个简单的待办事项应用程序,并在 session 中出现异常时提供恢复计划:

Then there is the problem of error handling. If you get an exception (such as StaleObjectStateException, because of concurrency conflict), your session and its loaded entities are toast, because with NHibernate, an exception thrown from a session moves that session into an undefined state. You can no longer use that session or any loaded entities. If you have only a single global session, it means that you probably need to restart the application, which is probably not a good idea.

关于nhibernate - 查询异常后 NHibernate session 的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12778063/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com