2012-04-03 43 views
0

首先,这可能是现成的吗?Hibernate's'session.flush'上的多线程

Hibernate 3.6,JDBC batch_size 500,在 上使用Hilo生成器200.000个实体。

在我的示例中,我有一个需要56秒的请求,并且我在会话中创建了200,000个实体。因此,session.flush()命令只需要一个CPU核心在%100时56秒内就有32个。

有没有办法获得需要更新的实体列表并创建SQL语句,比如在四个线程中说?

回答

1

不能简单地在不同的线程中使用flush(),因为flush()所做的基本上是使用基础连接将所有挂起的SQL INSERT语句发送到数据库。 JDBC连接不是线程安全的,这意味着您将不得不使用4个不同的连接,并因此使用4个不同的事务。如果所有插入都需要在一个事务中进行,那么在这里没有任何事情可以做。

如果您可以接受4个不同的交易,只需创建一个线程池并以较小批量存储记录。池将在多个线程上分配INSERT操作。

你也确定这会真的有帮助吗?我猜flush()不受CPU限制,但I/O或网络绑定。然而,你的经验与100%的使用不同,所以我可能是错的。还可以尝试优化INSERT s - 使用无状态会话,原始JDBC/Native查询,批量插入等。分割成单独的线程要困难得多。

+0

即时打印时间前后session.flush命令和它需要32秒。就我而言,一直在四处搜索和stackoverflow,flush是创建sql语句的位置,还是它们都是发送到mySQL端的事务的命令? – kommradHomer 2012-04-03 12:05:40

+0

@kommradHomer:在'flush()'期间,创建**和** SQL语句到数据库服务器。我想创建SQL只需要一小部分时间。真正的开销是传输数据并等待结果(数据库端)。 – 2012-04-03 12:09:36

+0

,考虑到我在localhost上做了这个测试,那么关于mySQL的所有内容 – kommradHomer 2012-04-03 12:11:19