我正在处理应用程序的延迟敏感部分,基本上我将收到一个网络事件转换数据,然后将所有数据插入到数据库中.在分析后,我发现基本上所有的时间都花在尝试保存数据上.这是代码
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) 使用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基本.
我错过了一个设置吗?
我有一个测试用例,我需要将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)
@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) 我有一个程序,它逐行读取文本文件,并从每一行创建一个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)