Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringRoo项目作为没有事务的批处理作业_Java_Spring_Transactions_Spring Roo - Fatal编程技术网

Java SpringRoo项目作为没有事务的批处理作业

Java SpringRoo项目作为没有事务的批处理作业,java,spring,transactions,spring-roo,Java,Spring,Transactions,Spring Roo,我有一个Roo项目,它可以“很好地”处理事务,但每个.merge()或.persist()都需要越来越长的时间,因此本应花费10毫秒的时间在事务结束时需要5000毫秒。幸运的是,我的更改是独立幂等的,所以我实际上不需要事务 但是当我抛出事务处理时,我在执行myObject.merge()时遇到了经典的“上下文已关闭” 我正在运行的作业是作为批处理从命令行执行的,因此我通常会执行以下操作: public static void main(final String[] args) { con

我有一个Roo项目,它可以“很好地”处理事务,但每个.merge()或.persist()都需要越来越长的时间,因此本应花费10毫秒的时间在事务结束时需要5000毫秒。幸运的是,我的更改是独立幂等的,所以我实际上不需要事务

但是当我抛出事务处理时,我在执行myObject.merge()时遇到了经典的“上下文已关闭”

我正在运行的作业是作为批处理从命令行执行的,因此我通常会执行以下操作:

public static void main(final String[] args) {
    context = new ClassPathXmlApplicationContext("META-INF/spring/applicationContext.xml");
    JpaTransactionManager txMgr = (JpaTransactionManager) context.getBean("transactionManager");
    TransactionTemplate txTemplate = new TransactionTemplate(txMgr);
    txTemplate.execute(new TransactionCallback() { @SuppressWarnings("finally")
    public Object doInTransaction(TransactionStatus txStatus) {
    try {
        ImportUnitFromDisk importer = new ImportUnitFromDisk();
        int status = importer.run(args[0]);
        System.out.println("Import data complete status: " + status);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        return null;
    }
    }});

    System.out.println("All done!");
    System.exit(0);
}
但我真正想做的是这样的:

public static void main(final String[] args) {
    ImportUnitFromDisk importer = new ImportUnitFromDisk();
    int status = importer.run(args[0]);
    System.out.println("Import data complete status: " + status);
    System.out.println("All done!");
    System.exit(0);
}
考虑到实体是使用SpringRoo(使用OpenJPA和MySQL)生成的,我可以做什么来允许我在不使用事务的情况下持久化()和合并()

干杯


Nik

即使您的更改是幂等的,您仍然需要事务

就性能而言

  • 实体对象的耦合程度如何。(例如,如果所有表fk引用都迁移到实体关系,则其耦合非常紧密)

  • 也许你应该删除一些不需要的双向关系

  • 标识主表并删除映射到主记录的实体

  • 您的级联选项是什么?检查是否在所有位置都有级联所有选项


  • 对我来说,实体图的耦合太紧密了(每个人都知道有人有…),级联选项开始合并整个对象图。(记录您的jpa sql,这可以验证我的假设)

    我在Spring/Hibernate批处理过程中遇到了完全相同的性能问题。请注意,这与SpringRoo甚至Spring无关——这是由于Hibernate/JPA的工作

    基本问题是Hibernate维护一个属于事务一部分的所有Java实体的会话缓存,对于新实体(尚未完成字节码检测),Hibernate必须在每次刷新时扫描实体,以查看是否有更新。对于会话中的n=#个新实体,这至少是O(n)。如果批处理过程主要是添加新实体,那么这将变成整个批处理的O(n^2)行为

    如果要在一个事务中维护整个流程,一种解决方案是定期刷新(执行插入/更新),然后逐出不再需要保留在会话中的实体。另一个解决方案是将批处理过程拆分为多个事务


    有关更多详细信息,请参阅。

    它们是紧密耦合的,就像一卷有很多文档,有很多页面,因为一卷有很多页面,我需要查找文档,卷引用了文档和页面,当然也有相反的内容。我将看一看级联选项我认为从你的问题来看,很明显,这些对象都是紧密联系在一起的。我知道有时候域本身有紧密耦合的对象,但是,您不能用查询替换关系,或者请建议延迟加载到映射,并明确查看您的级联选项。因为级联是ORM查找要合并的子实体的原因。我应该补充:一切都是延迟加载延迟加载只会影响查询时性能。这是一个更一般的观点。你在事务中所做的事情是:只读吗?是的,我可能把Hibernate当作银弹用得太多了。我最终将其拆分为多个较小的事务,但如果我再次这样做,我想我会三思而后行使用ORM。