有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

hibernate中的java批量更新

批量更新在本地系统上运行良好,但在测试服务器上执行需要数小时。虽然数据库使用不多,包含150000条记录

    Session session=hibernateTemplate.getSessionFactory().openSession();
    String sqlQuery = "FROM DemoDB";
    List<DemoDB> demoList = session.createQuery(sqlQuery).list();
    for (int j = 0; j < demoList.size(); j++) { 
        DemoDB demoObj = demoList.get(j);
        if(emailFlagMap.containsKey(demoObj.getEmail()))
        {
            demoObj.setSendOutDone(emailFlagMap.get(demoObj.getEmail()));
        }

        session.update(demoObj);
        if (j % 1000 == 0 && j > 0) {
            session.flush();
            session.clear();
        }

    }
    session.flush();
    session.clear();
    session.close();
}
catch(Exception e)
{
    logger.error("Exception occurred while getting response :"+e);
    e.printStackTrace();
}

共 (1) 个答案

  1. # 1 楼答案

    请在下面试试。如果您将任何新值设置为任何字段,则以其他方式更新记录忽略此记录

            Session session=hibernateTemplate.getSessionFactory().openSession();
            String sqlQuery = "FROM DemoDB";
            List<DemoDB> demoList = session.createQuery(sqlQuery).list();
            for (int j = 0; j < demoList.size(); j++) { 
                DemoDB demoObj = demoList.get(j);
                if(emailFlagMap.containsKey(demoObj.getEmail()))
                {
                    demoObj.setSendOutDone(emailFlagMap.get(demoObj.getEmail()));
                    session.update(demoObj);
                }
    
    
                if (j % 1000 == 0 && j > 0) {
                    session.flush();
                    session.clear();
                }
    
            }
            session.flush();
            session.clear();
            session.close();
        }
        catch(Exception e)
        {
            logger.error("Exception occurred while getting response :"+e);
            e.printStackTrace();
        }