我正在尝试编写一种机制来管理我的保存到数据库操作。
我向服务器发送一个对象列表,它会迭代它们并保存每个对象。
现在,如果他们因某些奇怪的原因(例外)失败,它会将它们保存到另一个列表中 有一个每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 {
....
}
现在,当保存丢失的交易时 - 如果发生异常 - 同步的块将停止它。
对于这种保存后备机制,您有什么要说的?是否有更好的设计模式来处理这个常见问题?
答案 0 :(得分:1)
我建议使用proxy
或aspects
来处理回滚/重试机制。代理可以使用类似strategy
模式的内容来获取有关要采取的操作的建议。
如果你不想立即重试,但是在你建议的5秒内说,我会考虑通过提供异步例程来构建数据库层的合同。类似于dao.scheduleStore(o);
或dao.asyncStore(o);
的内容。
答案 1 :(得分:1)
取决于
例如,
请求保存实体--->发生例外--->数据库连接问题---->在异常块中重试以在后备DB中保存实体----->将响应返回给请求
请求保存实体--->发生例外--->数据库连接问题---->在异常块重试中将实体保存在应用程序的内存存储中----->将响应返回给请求
请求保存实体---->发生异常---->未知的例外---->在异常块中将实体保存到XML文件存储[在XML中序列化] ---->返回提及临时保存的响应将在以后更新请求
计时器---->检查文件存储中的任何序列化XML ---->更新数据库
要注意的要点