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

标签 java database persistence

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

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

现在,如果它们由于某种奇怪的原因(异常)而失败,它会将它们保存到另一个列表中 有一个每 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)将停止它。

对于这个保存回退机制,你有什么想说的吗?是否有更好的设计模式来处理这个常见问题?

最佳答案

我建议使用 proxyaspects 来处理回滚/重试机制。代理可以使用类似 strategy 的东西关于采取什么行动的建议模式。

但是,如果您不想立即重试,而是按照您的建议在 5 秒后重试,我会考虑通过提供异步例程开始将其构建到您的数据库层的契约中。类似于 dao.scheduleStore(o);dao.asyncStore(o);

关于java - 如何编写回退机制来保存第一次未成功保存的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5450507/

相关文章:

java - 如何在 Spring 中使用 JPA 存储库从服务器检索 blob

ios - 考虑到突变和关系,我怎样才能拥有基于协议(protocol)的数据模型?

mysql - 是mysql还是mysqld?

php - 如何使用表单发送所有购物车商品并插入数据库表

database - 如何使用 postgres_fdw 连接到本地主机?

python - 搁置对于大型词典来说太慢了,我该怎么做才能提高性能?

tomcat - 在 context.xml 和 persistence.xml 中使用 jdbc.properties

java - 如何使用 BufferedInputStream 检测 Socket 输入流的结束?

Java 并发收集少写多读

java - 如何从主方法获取参数到测试类