我应该在这种多线程架构中使用Hibernate还是放弃它?

时间:2010-07-29 03:36:44

标签: java multithreading hibernate persistence

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

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

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

这种架构的目的主要是排队效率。

我需要“Get and Feed Work”线程拥有自己的数据库会话/连接,以便它可以连续读取数据库,解锁并将数据提供给工作线程。

每个工作线程还需要自己的数据库连接/会话,主要是在他们正在处理的任何任务中更新数据库中的进度。这些数据库连接/会话始终是低影响,不经常更新。每个工作线程产生一些重要的东西,需要插入DB。而不是每个工作线程都执行自己的插入,而是将该责任推到了“保存输出”线程。

“保存输出”线程通过批量执行来提高写入数据库的效率 - 批量插入比一次更快。

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

我发现自己遇到了许多处理Hibernate会话,驱逐,合并,清算,刷新问题的问题。

我的架构目前似乎很稳定,但它看起来也非常低效。抛弃Hibernate并直接使用JDBC会不会更好?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

从会话加载的Hibernate会话和对象不是线程安全的,因此它们不能被同时的不同线程访问,但是可以从不同的线程顺序访问它们。从你的过程描述来看,线程之间似乎没有重叠,所以你应该很好地传递对象和会话。

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