Java Hibernate:无法在进程之间查看MYSQL中的持久数据
我不是核心的Hibernate程序员 创建本机查询返回批量数据百万条记录:Java Hibernate:无法在进程之间查看MYSQL中的持久数据,java,mysql,spring,hibernate,jpa,Java,Mysql,Spring,Hibernate,Jpa,我不是核心的Hibernate程序员 创建本机查询返回批量数据百万条记录: return super.em.createNativeQuery(query).getResultList(); 获取数据并构建使用DAO在循环中持久化的对象,该循环有100万个持久化对象 persist(object) 当我同时在表上运行select查询时,它会显示0个结果 Select count(*) from Audit_Log; 成功插入所有记录后,MySQL向我显示结果 早些时候,我被命名为从DAO获
return super.em.createNativeQuery(query).getResultList();
获取数据并构建使用DAO在循环中持久化的对象,该循环有100万个持久化对象
persist(object)
当我同时在表上运行select查询时,它会显示0个结果
Select count(*) from Audit_Log;
成功插入所有记录后,MySQL向我显示结果
早些时候,我被命名为从DAO获取值的查询,它工作得很好。现在我选择了本机查询并得到了这种行为。有什么我需要改变的吗
代码:
您是否在单笔交易中保留10L(即1M)记录?看起来就是这样。现在,由于TX已打开相当长的一段时间,在TOAD(或任何其他SQL客户机)上启动查询将不会返回它,因为数据尚未提交到数据库中
尝试刷新中间的数据
另外,我希望您在hibernate和驱动程序级别上使用批处理。我无法在不进行批处理的情况下持久化1M记录。您需要尝试的第一件事是使用方法刷新或在持久化完成时关闭会话目录 解释如下: persist()使临时实例持久化。但是,它不能保证标识符值将立即分配给持久实例,分配可能在刷新时发生。persist()还保证,如果在事务边界之外调用INSERT语句,它将不会执行INSERT语句。这在具有扩展会话/持久性上下文的长时间运行会话中非常有用
试试这个代码片段,它和我们在JDBC批处理中使用的方法类似
public Long save(HttpServletRequest request) {
//Further business logic here....
for ( int i=0; i<count; i++ ) {
getEntityManager().persist((ABC) model);
if ( i > 0 && i % 2500== 0 ) {
getEntityManager().flush();
getEntityManager().clear();
}
}
tx.commit();
((EntityManager) session).close();
}
public长保存(HttpServletRequest){
//进一步的业务逻辑在这里。。。。
对于(int i=0;i 0&&i%2500==0){
getEntityManager().flush();
getEntityManager().clear();
}
}
tx.commit();
((EntityManager)会话).close();
}
显示整个代码和数据流,它不清晰。IMP,当您坚持时,可能只是忘记刷新。@DemonColdmist:添加了代码。我们正在调用DAO方法。刚才我插入了一条记录,发现若在这两条记录之间抛出异常,那个么它就不会持久化。由于没有坚持;它说被删除的实体错误看起来这里有多个问题。很明显,若中间有错误,它将不会持续存在,并且它将变得“分离”,因为会话已关闭,对象仍在后面悬空。在移动到1m之前,您应该能够保留至少一个对象。根据您的建议->我现在使用它-->@Transactional(isolation=isolation.READ_UNCOMMITTED)public Person CreateWithReadUncommittedIsolation(Person per){this.em.persist(per);this.em.flush();return per;}<---并试图执行任务。它不会产生问题。一次又一次地关闭/打开/关闭。就像在循环中一样,我不能多次这样做。图片中有多个表正在循环中更新。为什么要一次又一次地关闭打开/打开关闭?好吧,即使你这样做,你也可以将会话从循环中清除。实际上这是一个人的循环,我们在循环中添加了多个东西,比如它的亲属、帐户等等。如果添加了一个人,将刷新并添加帐户信息。然后再次添加其他人并将刷新和其他信息导入您应该知道的是,无论您操作了多少数据,会话都是创建为CRUD的。此外,您应该在代码中添加事务。因此,首先,您应该理解会话。我现在使用的是-->@Transactional(isolation=isolation.READ_UNCOMMITTED)public Person CreateWithReadUncommittedIsolation(Person per){this.em.persist(per);this.em.flush();return per;}<---并尝试执行
@Override
public Person create(Person person) {
return (Person) create((MainRecord) person);
}
public Long save(HttpServletRequest request) {
//Further business logic here....
for ( int i=0; i<count; i++ ) {
getEntityManager().persist((ABC) model);
if ( i > 0 && i % 2500== 0 ) {
getEntityManager().flush();
getEntityManager().clear();
}
}
tx.commit();
((EntityManager) session).close();
}