【问题标题】:Multithreading on Hibernate's 'session.flush'Hibernate 的“session.flush”上的多线程
【发布时间】:2012-04-03 11:54:43
【问题描述】:

首先,这可能是现成的吗?

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

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

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

【问题讨论】:

    标签: java multithreading hibernate jdbc


    【解决方案1】:

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

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

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

    【讨论】:

    • 我只是打印 session.flush 命令前后的时间,需要 32 秒。就我一直在搜索和 stackoverflow 而言,flush 是创建 sql 语句的位置,还是将它们全部发送到 mySQL 端的事务的命令?
    • @kommradHomer:在flush()期间创建SQL语句发送到数据库服务器。我猜想创建 SQL 只需要一小部分时间。真正的开销是传输数据并等待结果(数据库端)。
    • 考虑到我是在 localhost 上做这个测试的,那么一切都是关于 mySQL 的
    猜你喜欢
    • 1970-01-01
    • 2011-03-17
    • 2011-09-16
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    相关资源
    最近更新 更多