gpt4 book ai didi

java - 有什么方法可以让 JPA 更快地持久化对象吗?

转载 作者:行者123 更新时间:2023-12-01 18:36:31 25 4
gpt4 key购买 nike

使用 JPA、Hibernate/MVC/Servlet,我尝试在数据库中上传 .csv 文件。该文件有 90k+ 行长。我设法完成的工作是使用 Servlet 上传 .csv,读取每一行并将行拆分为列插入。在我的 while 循环中,我创建 EntityManager,将数据插入新对象中,保留并提交。我工作了,但花了大约 5 个小时来传递所有数据。有什么我可以改变的吗?我对编程比较陌生。这是我的代码:

Scanner s = new Scanner(myCSVasInputStream).useDelimiter("\\n");
while(s.hasNext()) {
try{
EntityManager em = JPAUtils.createEntityManager();
em.getTransaction().begin();
String row = s.next();
String[] column = row.split(;);
myEntity m = new myEntity();
m.setValue(column[0]);
em.persist(m);
em.getTransaction().commit();
} catch (Excepltion e) {
system.out.print("I think i need to catch exception for duplicate rows");
}
}

最佳答案

即使是带有 HDD 的 2010 年旧计算机也可以轻松插入 1000 行/秒。但你必须避免糟糕的软件/算法。

list :

a) 仔细检查您的数据库调整。例如,开发模式 mysql 是对真实服务器的蹩脚引用。它具有微小的缓冲区、池等...Linux 虚拟机导入 mysqldump 的速度比 Windows 虚拟机快 10 倍...仅作为示例...让服务器做好艰苦工作的准备。

b) 如果您将 @Transactional 放在所有内容上,则可能会为每一行查看大量 Java 堆栈帧。检查你的CPU是否受限。对于此类插入,您通常应该受到 io 限制。在这里,您对每一行执行 TXN...

c) 也不要尝试进行 90000 行的单个事务,那是愚蠢的。我知道你不是,就这样吧。也许完全避免 TXN,因为我看不出对您的情况有什么好处。

如果您可以避免 hibernate ,那么您有几个选择:

d)显然服务器端准备好的语句更好。

e) 在准备好的语句之上,使用批处理语句(开始时一次可以执行 20-100 个,找到最佳点)。

f) 如果你真的不胆怯,并且没有人妨碍你提示他们不理解的事情并在该死的代码审查中阻止你的拉取请求(!),你实际上可以让 mysql 读取直接 CSV,带有加载就绪文件 (LOAD DATA INFLE https://dev.mysql.com/doc/refman/8.0/en/load-data.html )。 Postgress 有类似的东西。大多数供应商应该这样做。通常,您必须将整理后的 CSV 文件(正确的分隔符和引号)存储在数据库服务器本身上,因此这在远程数据库上可能是不可能的。但它的速度快得惊人。为了实现这一点,在数据库实例上放置一个文件上传微服务几乎是值得的。

希望这有帮助。

关于java - 有什么方法可以让 JPA 更快地持久化对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029651/

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