我正在尝试编写一种机制来管理我保存到数据库的操作。
我向服务器发送对象列表,它迭代它们并保存每个对象。
现在,如果它们由于某种奇怪的原因(异常)而失败,它会将它们保存到另一个列表中 有一个每 5 秒运行一次的计时器,并尝试重新保存它们。
然后我有一个锁定问题,我可以用另一个 boolean 值来解决。
我保存丢失对象的函数是:
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 {
....
}
现在,当丢失的交易被保存时——如果发生异常——同步块(synchronized block)将停止它。
对于这个保存回退机制,你有什么想说的吗?是否有更好的设计模式来处理这个常见问题?
最佳答案
我建议使用 proxy
或 aspects
来处理回滚/重试机制。代理可以使用类似 strategy
的东西关于采取什么行动的建议模式。
但是,如果您不想立即重试,而是按照您的建议在 5 秒后重试,我会考虑通过提供异步例程开始将其构建到您的数据库层的契约中。类似于 dao.scheduleStore(o);
或 dao.asyncStore(o);
。
关于java - 如何编写回退机制来保存第一次未成功保存的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5450507/