相关疑难解决方法(0)

高性能休眠插入

我正在处理应用程序的延迟敏感部分,基本上我将收到一个网络事件转换数据,然后将所有数据插入到数据库中.在分析后,我发现基本上所有的时间都花在尝试保存数据上.这是代码

private void insertAllData(Collection<Data> dataItems)
{
    long start_time = System.currentTimeMillis();
    long save_time = 0;
    long commit_time = 0;
    Transaction tx = null;
    try
    {
        Session s = HibernateSessionFactory.getSession();
        s.setCacheMode(CacheMode.IGNORE);
        s.setFlushMode(FlushMode.NEVER);
        tx = s.beginTransaction();
        for(Data data : dataItems)
        {
            s.saveOrUpdate(data);
        }
        save_time = System.currentTimeMillis();
        tx.commit();
        s.flush();
        s.clear();
    }
    catch(HibernateException ex)
    {
        if(tx != null)
            tx.rollback();
    }
    commit_time = System.currentTimeMillis();
    System.out.println("Save: " + (save_time - start_time));
    System.out.println("Commit: " + (commit_time - save_time));
    System.out.println();
}
Run Code Online (Sandbox Code Playgroud)

集合的大小总是小于20.这是我看到的时间数据:

Save: 27
Commit: 9

Save: 27
Commit: …
Run Code Online (Sandbox Code Playgroud)

java performance hibernate3

16
推荐指数
1
解决办法
2万
查看次数

如何在休眠中启用批量插入?

使用hibernate,当我尝试启用批量插入时

  <property name="jdbc.batch_size">50</property>
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

 [...] cfg.SettingsFactory INFO  - JDBC batch updates for versioned data: disabled
 [...] cfg.SettingsFactory INFO  - Order SQL inserts for batching: disabled
Run Code Online (Sandbox Code Playgroud)

然后这个:

 [...] jdbc.AbstractBatcher DEBUG - Executing batch size: 1
Run Code Online (Sandbox Code Playgroud)

从来没有超过batch size: 1基本.

我错过了一个设置吗?

java database performance hibernate batch-processing

11
推荐指数
2
解决办法
3万
查看次数

Spring Data JPA:嵌套实体的批量插入

我有一个测试用例,我需要将100'000个实体实例保存到数据库中.我目前正在使用的代码执行此操作,但最多需要40秒才能将所有数据保留在数据库中.从JSON文件中读取数据,该文件大小约为15 MB.

现在我已经在自定义存储库中为另一个项目实现了批量插入方法.但是,在这种情况下,我有很多顶级实体要坚持,只有几个嵌套实体.

在我目前的情况下,我有5个Job实体,其中包含约30个JobDetail实体的列表.一个JobDetail包含850到1100个JobEnvelope实体.

写入数据库时​​,我Job使用默认save(Iterable<Job> jobs)接口方法提交实体列表.所有嵌套实体都具有CascadeType PERSIST.每个实体都有自己的表.

启用批量插入的常用方法是实现一个自定义方法,例如saveBatch每隔一段时间刷新一次.但在这种情况下我的问题是JobEnvelope实体.我不会将它们与JobEnvelope存储库保持一致,而是让Job实体的存储库处理它.我正在使用MariaDB作为数据库服务器.

所以我的问题归结为以下几点:如何JobRepository批量插入嵌套实体?

这些是我的3个问题:

工作

@Entity
public class Job {
  @Id
  @GeneratedValue
  private int jobId;

  @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST, mappedBy = "job")
  @JsonManagedReference
  private Collection<JobDetail> jobDetails;
}
Run Code Online (Sandbox Code Playgroud)

的JobDetail

@Entity
public class JobDetail {
  @Id
  @GeneratedValue
  private int jobDetailId;

  @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
  @JoinColumn(name = "jobId")
  @JsonBackReference
  private …
Run Code Online (Sandbox Code Playgroud)

java hibernate spring-data-jpa

8
推荐指数
1
解决办法
9433
查看次数

使用Hibernate进行批量保存的更快方法?

我有一个程序,它逐行读取文本文件,并从每一行创建一个Hibernate实体对象,并保存它们.我有几个这样的文本文件要处理,每个文件都有大约300,000行.我发现我目前的实施速度非常慢,而且我想知道我能做些什么来改进.

我的main方法逐行处理文本文件,如下所示:

// read the file line by line
FileInputStream fileInputStream = new FileInputStream(new File(fileName));
InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
int lineCount = 0;
String line = bufferedReader.readLine();
while (line != null)
{
    // convert the line into an Observations object and persist it
    convertAndPersistObservationsLine(line);

    // if the number of lines we've processed has built up to the JDBC batch size then flush
    // and clear the session in order to control the size of …
Run Code Online (Sandbox Code Playgroud)

java hibernate batch-file

3
推荐指数
1
解决办法
7328
查看次数