首先,这可能是现成的吗?Hibernate's'session.flush'上的多线程
Hibernate 3.6,JDBC batch_size 500,在 上使用Hilo生成器200.000个实体。
在我的示例中,我有一个需要56秒的请求,并且我在会话中创建了200,000个实体。因此,session.flush()
命令只需要一个CPU核心在%100时56秒内就有32个。
有没有办法获得需要更新的实体列表并创建SQL语句,比如在四个线程中说?
首先,这可能是现成的吗?Hibernate's'session.flush'上的多线程
Hibernate 3.6,JDBC batch_size 500,在 上使用Hilo生成器200.000个实体。
在我的示例中,我有一个需要56秒的请求,并且我在会话中创建了200,000个实体。因此,session.flush()
命令只需要一个CPU核心在%100时56秒内就有32个。
有没有办法获得需要更新的实体列表并创建SQL语句,比如在四个线程中说?
不能简单地在不同的线程中使用flush()
,因为flush()
所做的基本上是使用基础连接将所有挂起的SQL INSERT
语句发送到数据库。 JDBC连接不是线程安全的,这意味着您将不得不使用4个不同的连接,并因此使用4个不同的事务。如果所有插入都需要在一个事务中进行,那么在这里没有任何事情可以做。
如果您可以接受4个不同的交易,只需创建一个线程池并以较小批量存储记录。池将在多个线程上分配INSERT
操作。
你也确定这会真的有帮助吗?我猜flush()
不受CPU限制,但I/O或网络绑定。然而,你的经验与100%的使用不同,所以我可能是错的。还可以尝试优化INSERT
s - 使用无状态会话,原始JDBC/Native查询,批量插入等。分割成单独的线程要困难得多。
即时打印时间前后session.flush命令和它需要32秒。就我而言,一直在四处搜索和stackoverflow,flush是创建sql语句的位置,还是它们都是发送到mySQL端的事务的命令? – kommradHomer 2012-04-03 12:05:40
@kommradHomer:在'flush()'期间,创建**和** SQL语句到数据库服务器。我想创建SQL只需要一小部分时间。真正的开销是传输数据并等待结果(数据库端)。 – 2012-04-03 12:09:36
,考虑到我在localhost上做了这个测试,那么关于mySQL的所有内容 – kommradHomer 2012-04-03 12:11:19