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

标签 java multithreading hibernate persistence

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

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

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

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

我需要“Get and Feed Work”线程拥有自己的数据库 session /连接,以便它可以连续地从数据库中读取数据,畅通无阻,并将该数据提供给工作线程。

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

“保存输出”线程通过分批执行写入 DB 的效率更高 - 分批插入比一次插入快得多。

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

我发现自己在处理 Hibernate session 、逐出、合并、清除、刷新等方面遇到了很多问题,我的天啊。

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

最佳答案

您可以分离在 session 之间传递的对象,或仅传递对象 ID。

关于java - 我应该在这种多线程架构下使用 Hibernate 还是放弃它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3359317/

相关文章:

java - Java 中的 URLDecoder 在 "São Paulo"处阻塞

java - Java 是否支持内部/本地/子方法?

java - 捕获 Activity 窗口的屏幕截图

java - 使用线程池退出线程的无限循环

java - Dropwizard :"error processing your request"用于从数据库中检索数据

Java Sax XML 解析器,解析 XML 标签内的自定义 "values"?

java - Android camera : Threads? 哪个应该做什么

java - 使用多线程时如何使用动画(application.class)

java - 为什么 Eclipse 不能导出类​​路径中包含的 Maven 库?

java - 如何在我的 hibernate 类中启用 c3p0 日志记录