Java Hibernate上的多线程&x27;s';session.flush';
首先,这可能是现成的吗 Hibernate 3.6,JDBC批量大小500,在 20万个实体 在我的示例中,我有一个需要56秒的请求,我正在会话中创建200000个实体。因此,Java Hibernate上的多线程&x27;s';session.flush';,java,multithreading,hibernate,jdbc,Java,Multithreading,Hibernate,Jdbc,首先,这可能是现成的吗 Hibernate 3.6,JDBC批量大小500,在 20万个实体 在我的示例中,我有一个需要56秒的请求,我正在会话中创建200000个实体。因此,session.flush()命令需要56秒中的32秒,其中只有一个CPU内核位于%100 有没有一种方法可以获取需要更新的实体列表并创建SQL语句,比如在四个线程中?您不能简单地在不同的线程中执行flush(),因为flush()基本上是使用底层连接将所有挂起的SQLINSERT语句发送到数据库。JDBC连接不是线程安全
session.flush()
命令需要56秒中的32秒,其中只有一个CPU内核位于%100
有没有一种方法可以获取需要更新的实体列表并创建SQL语句,比如在四个线程中?您不能简单地在不同的线程中执行
flush()
,因为flush()
基本上是使用底层连接将所有挂起的SQLINSERT
语句发送到数据库。JDBC连接不是线程安全的,这意味着您必须使用4个不同的连接,从而使用4个不同的事务。如果所有插入都需要在一个事务中进行,那么在这里您无法执行任何操作
如果您可以处理4个独立的事务,只需创建一个线程池并以较小的批存储记录。池将跨多个线程分发INSERT
操作
你确定这真的会有帮助吗?我猜
flush()
不是CPU绑定,而是I/O或网络绑定。但是你的体验与100%使用不同,所以我可能错了。还可以尝试优化INSERT
s-使用无状态会话、原始JDBC/本机查询、批插入等。拆分为单独的线程要困难得多。im只是在session.flush命令前后打印时间,需要32秒。就我一直在四处搜索和stackoverflow而言,flush是创建sql语句的地方,还是将它们全部发送到mySQL端事务的命令?@kommradHomer:duringflush()
sql语句被创建并发送到数据库服务器。我猜创建SQLs只需要一小部分时间。真正的开销是传输数据并等待结果(数据库端)