Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate上的多线程&x27;s';session.flush';_Java_Multithreading_Hibernate_Jdbc - Fatal编程技术网

Java Hibernate上的多线程&x27;s';session.flush';

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连接不是线程安全

首先,这可能是现成的吗

Hibernate 3.6,JDBC批量大小500,在 20万个实体

在我的示例中,我有一个需要56秒的请求,我正在会话中创建200000个实体。因此,
session.flush()
命令需要56秒中的32秒,其中只有一个CPU内核位于%100


有没有一种方法可以获取需要更新的实体列表并创建SQL语句,比如在四个线程中?

您不能简单地在不同的线程中执行
flush()
,因为
flush()
基本上是使用底层连接将所有挂起的SQL
INSERT
语句发送到数据库。JDBC连接不是线程安全的,这意味着您必须使用4个不同的连接,从而使用4个不同的事务。如果所有插入都需要在一个事务中进行,那么在这里您无法执行任何操作

如果您可以处理4个独立的事务,只需创建一个线程池并以较小的批存储记录。池将跨多个线程分发
INSERT
操作


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

im只是在session.flush命令前后打印时间,需要32秒。就我一直在四处搜索和stackoverflow而言,flush是创建sql语句的地方,还是将它们全部发送到mySQL端事务的命令?@kommradHomer:during
flush()
sql语句被创建并发送到数据库服务器。我猜创建SQLs只需要一小部分时间。真正的开销是传输数据并等待结果(数据库端)