EclipseLink,JPA,Mysql关闭Autocommit

时间:2014-03-17 13:28:42

标签: mysql sql jpa eclipselink

当我执行entityManager.persist();

时,我遇到了MySQL获取每一行的问题

我试过

JPAConnect.em.setFlushMode(FlushModeType.COMMIT);

没有运气。

或者有没有办法提交List<>无需遍历每一行?

jpac.beginTransaction();

        for (BuyLateStrategyEntity buyLateEntity : buyLateList) {
            stockName = buyLateEntity.getStockName();

            freader.readRawData(stockName, buyLateEntity.getTradeDate());


            //persist() done here.
            runningTotal *= findSalePrice(buyLateEntity.getClosePrice());

            System.out.println("Running total: " + runningTotal + " At Date: " + 
            buyLateEntity.getTradeDate() + " Instrument: " + buyLateEntity.getStockName());
        }
        jpac.commitTransaction();

1 个答案:

答案 0 :(得分:0)

如果您希望行按特定顺序命中DB,则唯一可以解决的方法是刷新。只需阅读FlushModeType here的文档,您就会明白它实际上会影响执行查询的刷新时间,而不会影响其他persist()次调用。

如果您只是希望行以任何特定顺序点击数据库,我只需为每一行(代码中缺少)调用em.persist()/merge(),但{{1在提交之前的ONCE(尽管在事务提交时会自动发生刷新)。

但如果你的想法是冲洗每一行:你是否试图解决正确的问题:为什么你需要在flush()循环中进行刷新?您可能只需要一个排序参数(如果该列表是另一个实体中的字段,JPA可以为您执行此操作)吗?请记住,即使您刷新一个条目,在您提交之前,其他事务也看不到结果(给定合理的事务隔离和支持事务的存储引擎,如InnoDB)。


更新(在您明确表示希望与数据库尽可能减少通信之后)

你已经做到了最好,只承诺(因此冲洗)一次。作为旁注:在EclipseLink中,如果您的数据库支持,则可以启用Batch Write。问题是MySQL只支持批量插入,而不支持更新,所以你不应该启用它。