mysql - EclipseLink、JPA、Mysql 关闭自动提交

标签 mysql sql jpa eclipselink

当我执行entityManager.persist();时,MySQL 无法提交每一行;

我尝试过

JPAConnect.em.setFlushMode(FlushModeType.COMMIT);

没有任何运气。

或者有没有办法提交列表<>而不必循环每一行?

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();

最佳答案

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

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

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

<小时/>

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

你已经尽力了,只提交(因此刷新)一次。附带说明:在 EclipseLink 中支持 Batch Write如果您的数据库支持,您可以启用它。问题是 MySQL 仅支持批量插入,而不支持更新,因此您不应该启用它。

关于mysql - EclipseLink、JPA、Mysql 关闭自动提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22455661/

相关文章:

mysql - 记录测试结果的数据库设计

mysql - 如何使用mysql选择组中的最后一条记录

java - 与 JPA 的数据库独立字符串比较

java - 在 JPA 中选择没有关联销售契约(Contract)的采购订单

PHP - 在对象内调用函数会导致错误 : 'Call to a member function query() on integer in'

mysql - 需要将数组转换为整数以用于 Rails API 中的 MySQL 查询

sql - 如果值为 1,则获取行的列名

java - 使用 Hibernate 创建数据库表

java - 从另一个线程取消 MySQL 查询执行

php - Mysql 仅返回具有 n 个属性匹配的项目