如何编写一个回退机制来保存第一次未成功保存的实体

时间:2011-03-27 16:22:19

标签: java database persistence

我正在尝试编写一种机制来管理我的保存到数据库操作。

我向服务器发送一个对象列表,它会迭代它们并保存每个对象。

现在,如果他们因某些奇怪的原因(例外)失败,它会将它们保存到另一个列表中 有一个每5秒运行一次的计时器,并尝试重新保存它们。

然后我有一个锁定问题,我可以用另一个布尔值解决。

我保存丢失物品的功能是:

private void saveLostDeals() {
    synchronized (unsavedDeals) {
        if (unsavedDeals.size() > 0) {
            for (DealBean unsavedDeal : unsavedDeals) {
                boolean successfullySaved = reportDeal(unsavedDeal,false);
                if (successfullySaved) {
                    unsavedDeals.remove(unsavedDeal);
                }
            }
        }
    }
}

我的reportDeal()方法正在调用常规报告和丢失的交易报告:

try {
    ...
    } catch (HibernateException e) {
       ...if (fallback)
     synchronized (unsavedDeals) {
            unsavedDeals.add(deal);
        }
        session.getTransaction().rollback();

    } finally {
       ....
    }

现在,当保存丢失的交易时 - 如果发生异常 - 同步的块将停止它。

对于这种保存后备机制,您有什么要说的?是否有更好的设计模式来处理这个常见问题?

2 个答案:

答案 0 :(得分:1)

我建议使用proxyaspects来处理回滚/重试机制。代理可以使用类似strategy模式的内容来获取有关要采取的操作的建议。

如果你不想立即重试,但是在你建议的5秒内说,我会考虑通过提供异步例程来构建数据库层的合同。类似于dao.scheduleStore(o);dao.asyncStore(o);的内容。

答案 1 :(得分:1)

取决于

例如,

请求保存实体--->发生例外--->数据库连接问题---->在异常块中重试以在后备DB中保存实体----->将响应返回给请求

请求保存实体--->发生例外--->数据库连接问题---->在异常块重试中将实体保存在应用程序的内存存储中----->将响应返回给请求

请求保存实体---->发生异常---->未知的例外---->在异常块中将实体保存到XML文件存储[在XML中序列化] ---->返回提及临时保存的响应将在以后更新请求

计时器---->检查文件存储中的任何序列化XML ---->更新数据库

要注意的要点

  1. 异步调用在这种情况下更好,而不是让请求客户端等待。
  2. 如果是内存保存,请注意数据库长时间故障时保存在内存中的数据量。这可能会影响整个应用程序
  3. 事务,是否要回滚保存其间歇状态。
  4. 要监视的数据的一致性