相关疑难解决方法(0)

使用Hibernate批量插入或更新?

我需要从每日CSV文件中消耗大量数据.CSV包含大约120K条记录.使用hibernate时,这会慢慢爬行.基本上,当使用saveOrUpdate()时,似乎hibernate在每个INSERT(或UPDATE)之前都在执行SELECT; 对于使用saveOrUpdate()持久化的每个实例,在实际INSERT或UPDATE之前发出SELECT.我可以理解它为什么会这样做,但它对于进行批量处理非常低效,而且我正在寻找替代方案

我确信性能问题在于我使用hibernate的方式,因为我有另一个版本使用本机SQL(以相同的方式解析CSV)以及围绕这个新版本的字面运行圈子)

那么,对于实际问题,是否存在一个hibernate替代mysqls"INSERT ... ON DUPLICATE"语法?

或者,如果我选择为此执行本机SQL,我可以在hibernate事务中执行本机SQL吗?意思是,它会支持提交/回滚吗?

java mysql hibernate

21
推荐指数
3
解决办法
7万
查看次数

没有约束异常处理的Hibernate线程安全幂等upsert?

我有一些执行UPSERT的代码,也称为Merge。我想清理这段代码,具体地说,我想摆脱异常处理,并为这种简单的操作降低代码的整体冗长性和纯粹的复杂性。要求是插入每个项目,除非它已经存在:

public void batchInsert(IncomingItem[] items) {
    try(Session session = sessionFactory.openSession()) {
        batchInsert(session, items);
    }
    catch(PersistenceException e) {
        if(e.getCause() instanceof ConstraintViolationException) {
            logger.warn("attempting to recover from constraint violation");
            DateTimeFormatter dbFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
            items = Arrays.stream(items).filter(item -> {
                int n = db.queryForObject("select count(*) from rets where source = ? and systemid = ? and updtdate = ?::timestamp",
                        Integer.class,
                        item.getSource().name(), item.getSystemID(), 
                        dbFormat.format(item.getUpdtDateObj()));
                if(n != 0) {
                    logger.warn("REMOVED DUPLICATE: " +
                            item.getSource() + " " + item.getSystemID() + " " + …
Run Code Online (Sandbox Code Playgroud)

java hibernate jpa

6
推荐指数
2
解决办法
327
查看次数

标签 统计

hibernate ×2

java ×2

jpa ×1

mysql ×1