休眠中的批量更新

时间:2018-02-12 09:13:03

标签: java hibernate bulkupdate

批量更新在本地系统上运行正常但在测试服务器上执行需要数小时。尽管数据库使用不多且包含150 000条记录。

    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 个答案:

答案 0 :(得分:0)

请尝试以下。如果您为任何字段设置任何新值,则更新记录,否则请忽略此记录。

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