相关疑难解决方法(0)

Hibernate批量大小混乱

该程序一个接一个地执行数万个连续插入.我以前从未使用过Hibernate.我的性能非常慢(如果我只是手动连接并执行SQL,我的速度要快10-12倍.根据许多hibernate教程,我的batch_size设置为50.

这是一个来自单个插入的日志 - 也许你可以帮我理解究竟发生了什么:

START INSERT
11:02:56.121 [main] DEBUG org.hibernate.impl.SessionImpl - opened session at timestamp: 13106053761                                                                                            
11:02:56.121 [main] DEBUG o.h.transaction.JDBCTransaction - begin                                                                                                                               
11:02:56.121 [main] DEBUG org.hibernate.jdbc.ConnectionManager - opening JDBC connection                                                                                                             
11:02:56.121 [main] TRACE o.h.c.DriverManagerConnectionProvider - total checked-out connections: 0                                                                                                    
11:02:56.121 [main] TRACE o.h.c.DriverManagerConnectionProvider - using pooled JDBC connection, pool size: 0                                                                                          
11:02:56.121 [main] DEBUG o.h.transaction.JDBCTransaction - current autocommit status: false                                                                                                    
11:02:56.121 [main] TRACE org.hibernate.jdbc.JDBCContext - after transaction begin                                                                                                             
11:02:56.121 [main] TRACE org.hibernate.impl.SessionImpl - setting flush mode to: MANUAL                                                                                                       
11:02:56.121 [main] …
Run Code Online (Sandbox Code Playgroud)

java hibernate jdbc

30
推荐指数
2
解决办法
5万
查看次数

JPA/Hibernate批量(批量)插入

这是我在阅读了几个关于jpa批量插入的主题后创建的简单示例,我有2个持久对象User和Site.一个用户可以有很多站点,所以我们在这里有一对多的关系.假设我想创建用户并创建/链接几个站点到用户帐户.考虑到我愿意为Site对象使用批量插入,这是代码的样子.

User user = new User("John Doe");

user.getSites().add(new Site("google.com", user));
user.getSites().add(new Site("yahoo.com", user));

EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此代码(我使用hibernate作为jpa实现提供程序)时,我看到以下sql输出:

Hibernate: insert into User (id, name) values (null, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Run Code Online (Sandbox Code Playgroud)

所以,我的意思是"真正的"批量插入不起作用或我感到困惑?

以下是此示例项目的源代码,这是maven项目,因此您只需下载并运行mvn install来检查输出.

更新:

在Ken Liu亲切地建议之后,我已禁用Site对象id自动生成:

    User user = new User("John Doe");
    user.getSites().add(new Site(1, "google.com", user));
    user.getSites().add(new …
Run Code Online (Sandbox Code Playgroud)

java persistence hibernate jpa openjpa

25
推荐指数
3
解决办法
5万
查看次数

无论如何,我都无法在Hibernate中批量处理MySQL INSERT语句

我目前正面临众所周知和常见的Hibernate插入批处理问题.

我需要保存500万行的批次.我首先尝试使用更轻的有效载荷.由于我必须只插入两种类型的实体(首先是所有类型A的记录,然后是所有类型B的记录,都指向公共类型C ManyToOne父级),我想从JDBC批量插入中获取最大优势.

我已经阅读了很多文档,但我没有尝试过.

  • 我知道为了使用批量插入,我不能使用实体生成器.所以我删除了AUTO_INCREMENTID,我用一个技巧设置了ID:SELECT MAX(ID) FROM ENTITIES每次都增加.
  • 我知道我必须定期清理会议.我将提前发布代码,但无论如何我每500个元素执行一次事务.
  • 我知道我必须设置hibernate.jdbc.batch_size与我的应用程序的批量大小一致,所以我在LocalSessionFactoryBean(Spring ORM集成)中设置它
  • 我知道我必须在连接URL中重写批量语句.

这是我的实体

共同的父实体.这将首先插入到单个事务中.我不关心这里的自动增量列.每批作业只有一个记录

@Entity
@Table(...)
@SequenceGenerator(...)
public class Deal
{

    @Id
    @Column(
            name = "DEAL_ID",
            nullable = false)
    @GeneratedValue(
            strategy = GenerationType.AUTO)
    protected Long id;

    ................
}
Run Code Online (Sandbox Code Playgroud)

其中一个孩子(假设每批2.5M记录)

@Entity
@Table(
        name = "TA_LOANS")
public class Loan
{

    @Id
    @Column(
            name = "LOAN_ID",
            nullable = false)
    protected Long id;

    @ManyToOne(
            optional = false, …
Run Code Online (Sandbox Code Playgroud)

java mysql hibernate jdbc batch-processing

18
推荐指数
1
解决办法
6310
查看次数

标签 统计

hibernate ×3

java ×3

jdbc ×2

batch-processing ×1

jpa ×1

mysql ×1

openjpa ×1

persistence ×1