我应该使用多线程吗?

时间:2016-03-16 15:43:48

标签: java multithreading hibernate httprequest

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

即使我无法将HttpRequest与hibernate插入分开,多线程是否会帮助我加快速度?

1 个答案:

答案 0 :(得分:3)

猜测你愿意尽快制作30 000个插页。您可以从100个线程开始,并从这些线程执行3 000次插入 - 但是对于每个线程,您需要一个专用数据库会话(数据库连接) - 否则您将无法获得任何性能优势。

考虑通过整个链的并发性

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

例如,Oracle允许您从多个会话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个会话是个好主意,因此您不应尝试制作1000个线程。简单地保持1000个数据库连接会损害数据库服务器,也可能损害您的应用程序。

优化往返次数

您应该注意到插入时间主要是浪费在各个呼叫上。即30 000插入是30 000往返数据库服务器。这需要很长时间。不幸的是,Hibernate在这方面也是超级低效的,所以你不能做太多。

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

考虑一下您的问题

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