【问题标题】:Is it possible to stop Hibernate during a save?是否可以在保存期间停止休眠?
【发布时间】:2012-09-12 15:34:04
【问题描述】:

我有一个将结构化格式的大文件上传到数据库的应用程序。结构是这样的,即保存一个 Data 对象,其中包含 DataRow 对象的集合。

有时这些文件可能会保存相当长的时间,在此保存期间,用户可能会决定取消操作。

我的问题是,除了杀死 JVM 之外,有没有办法停止持久化 Data 对象的过程?欢迎任何想法,包括对持久性技术的更改。

这是我的 DAO 中调用来持久化 Data 对象的方法。

@Override
public Data saveData(Data data) {

    Transaction transaction = null;

    Session session = HibernateUtil.getSessionFactory().openSession();
    Data merged = null;
    try{
        transaction = session.beginTransaction();
        merged = (Data) session.merge(data);
        transaction.commit();
    } catch (HibernateException e) {
        transaction.rollback();         
        throw e;
    } finally {
        session.close();
    }
    return merged;
}

【问题讨论】:

  • 它没有回答实际问题,但您可以异步进行保存。然后用户不需要知道保存需要多长时间。

标签: java hibernate persistence


【解决方案1】:

如果可能的话,最好的方式是实现以块的形式保存大量数据。持久化 - 服务应该被视为异步进程,以便客户端可以在数据被持久化的同时同时使用它。您可以使用初始值为“false”的线程局部变量,如“isCanceled”。在每次迭代中,您可以检查变量是否设置为“true”并取消持久化操作。但是,如果您需要回滚逻辑,则必须考虑一种逻辑,以从数据库中删除持久化的条目。

【讨论】:

  • 我不希望在整个结构准备好之前提交我的数据,Hibernate 无论如何都会为我处理批处理,其他应用程序会查看该数据,所以这不是一个选项,我需要停止休眠坚持并让它自己回滚。
【解决方案2】:

将会话设置为参数,以便您可以终止会话并进行回滚。

【讨论】:

  • 调用 session.close()?这会导致和异常并允许事务回滚吗?
  • 它被否决了,因为它不是好方法.. abvoe 是更好的方法
  • 单独提交每个位而不是管理事务中的所有内容并不好。我不希望个别行进入我的数据库,我想要全部或全部,这是处理事务的正确方法。这样做有没有什么特别不好的后果你能想到的。
猜你喜欢
  • 1970-01-01
  • 2011-07-13
  • 2011-12-16
  • 2022-01-04
  • 2011-09-06
  • 2016-05-16
  • 1970-01-01
  • 2011-08-17
  • 2018-08-03
相关资源
最近更新 更多