gpt4 book ai didi

java - 我应该使用多线程吗

转载 作者:行者123 更新时间:2023-12-01 21:45:39 24 4
gpt4 key购买 nike

我正在用 java 编写一个函数,用 hibernate 生成并保存一个唯一的代码,然后在 get 请求中发送它,我必须在一次调用中执行此操作 30,000 次。

即使我无法将 HttpRequest 与 hibernate 插入分开,多线程是否可以帮助我提高速度?

最佳答案

您愿意尽快插入 30 000 次。您可以启动大约 100 个线程,并从这些线程执行 3000 次插入 - 但是对于每个线程,您需要一个专用的数据库 session (数据库连接) - 否则您不会获得任何性能优势。

考虑整个链条的并发性

线程与否?实际上,这取决于您的数据库

例如,Oracle 允许您从多个 session 执行插入https://dba.stackexchange.com/questions/16131/how-does-oracle-handle-multiple-concurrent-inserts-against-one-table这意味着您的线程可以一起工作以尽快发送数据。降低提交率是一个好主意,并且仅在 100-1000 次插入后才提交事务以提高速度。

然而,在 MS SQL 上事情就没那么容易 https://social.msdn.microsoft.com/Forums/sqlserver/en-US/db00512d-0dc5-4bae-9ea4-7d6726d2d731/inserting-into-a-single-heap-table-from-multiple-sessions?forum=sqldatabaseengine并且有 SQL 引擎锁定整个表,因此实际上您的插入将完全串行执行。

有多少线程?

这又取决于您的数据库。在生产 Oracle 安装中,最好每个应用程序打开不超过 20-100 个 session ,因此您不应尝试创建 1000 个线程。仅仅保持 1000 个数据库连接就会损害数据库服务器,也可能损害您的应用程序。

优化往返

您应该注意到插入时间大部分浪费在各个调用上。 IE。 30 000 次插入相当于到数据库服务器的 30 000 次往返。这需要很长时间。不幸的是,Hibernate 在这方面的效率也非常低,所以你不能做太多事情。

一个好的解决方案是使用 JDBC 批处理模式,它与 Oracle 配合得非常好(与插入相比,性能提高了 10-100 倍),请参阅 http://viralpatel.net/blogs/batch-insert-in-java-jdbc/

思考你的问题

我确信一次操作插入 30 000 个东西是一个坏主意:) 与其提高插入速度,不如想想为什么你需要插入 30 000 个东西?您是否逐字节插入图片?

关于java - 我应该使用多线程吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36040504/

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