代码之家  ›  专栏  ›  技术社区  ›  JR Lawhorne

我应该在这个多线程体系结构中使用Hibernate还是放弃它?

  •  2
  • JR Lawhorne  · 技术社区  · 15 年前

    我的软件使用多个线程来完成它的工作。有一条管道看起来像这样:

                       +-----------------+
                       |+-----------------+
    +------------+     ||+-----------------+     +------------+
    |            |     |||                 |     |            |
    | Get and    |     ||| Worker Threads  |     |  Save      |
    | feed work  |--->>|||                 |--->>|     Output |
    |            |     |||   Do Work       |     |            |
    +------------+     +||                 |     +------------+
                        +|                 |
                         +-----------------+
    

    每个框代表一个单独的线程。它们之间的箭头是线程安全队列,供“工作”对象通过。“获取并馈送工作”线程从数据库中提取等待的工作,并将其馈送到工作线程池中。这些工作线程执行一些工作,更新工作对象上的状态标志(并将其存储到db)以及生成一些输出对象。输出对象流到“Save output”线程,在那里它们在数据库中被保存和/或更新。

    这种体系结构的主要目的是提高排队效率。

    我需要“Get and Feed Work”线程拥有自己的DB会话/连接,这样它就可以连续地从DB读取数据,解除阻塞,并将数据提供给工作线程。

    “Save Output”线程通过成批执行来提高向数据库的写入效率—成批插入比一次一个插入快得多。

    我开始认为Hibernate可能不适合这种架构。

    我发现自己在处理休眠会话、逐出、合并、清除、刷新时遇到了很多问题。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Guillaume    15 年前

    休眠会话和从会话加载的对象不是线程安全的,因此不同的线程无法访问它们 同时 按顺序 . 从进程的描述来看,线程之间似乎没有重叠,因此应该很好地传递对象和会话。

    但请确保不要使用线程绑定会话,不要使用 SessionFactory.getCurrentSession()

        2
  •  1
  •   Maurice Perry    15 年前

    可以分离会话之间传递的对象,也可以只传递对象ID。