gpt4 book ai didi

java - 如何使用 Hibernate 尽可能快地插入数据

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:39 30 4
gpt4 key购买 nike

我读取文件并从中创建一个对象并存储到 postgresql 数据库。我的文件有 100,000 个文档,我从一个文件中读取并拆分它,最后存储到数据库中。我无法创建 List<>并将所有文档存储在 List<> 中因为我的内存很小。我读取和写入数据库的代码如下。但 My JVM Heap 已满而无法继续存储更多文件。如何高效地读取文件并存储到数据库。

public void readFile() {
StringBuilder wholeDocument = new StringBuilder();
try {
bufferedReader = new BufferedReader(new FileReader(files));
String line;
int count = 0;
while ((line = bufferedReader.readLine()) != null) {
if (line.contains("<page>")) {
wholeDocument.append(line);
while ((line = bufferedReader.readLine()) != null) {
wholeDocument = wholeDocument.append("\n" + line);
if (line.contains("</page>")) {
System.out.println(count++);
addBodyToDatabase(wholeDocument.toString());

wholeDocument.setLength(0);
break;
}
}
}
}
wikiParser.commit();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}

public void addBodyToDatabase(String wholeContent) {
Page page = new Page(new Timestamp(System.currentTimeMillis()),
wholeContent);
database.addPageToDatabase(page);
}

public static int counter = 1;

public void addPageToDatabase(Page page) {
session.save(page);
if (counter % 3000 == 0) {
commit();
}
counter++;
}

最佳答案

首先你应该申请一个fork-join方法在这里。

主任务解析文件并将最多 100 个项目的批处理发送到 ExecutorService . ExecutorService 的工作线程数应等于可用数据库连接数。如果您有 4 个 CPU 内核,假设数据库可以处理 8 个并发连接而无需进行太多上下文切换。

然后您应该配置一个连接池 DataSource 并使 minSize 等于 maxSize 并且等于 8。尝试使用 HikariCP 或 ViburDBCP 进行连接池。

然后需要配置JDBC批处理。如果您使用的是 MySQL,IDENTITY 生成器将禁用沐浴。如果您使用的是支持序列的数据库,请确保您还使用了增强的标识符生成器(它们是 Hibernate 5.x 中的默认选项)。

通过这种方式,实体插入过程是并行化的,并且与主解析线程分离。主线程应等待 ExecutorService 在关闭之前完成所有任务的处理。

关于java - 如何使用 Hibernate 尽可能快地插入数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34738708/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com