【发布时间】:2010-07-29 03:36:44
【问题描述】:
我的软件使用多个线程来完成它的工作。有一个管道看起来像这样:
+-----------------+ |+-----------------+ +------------+ ||+-----------------+ +------------+ | | ||| | | | |获取和 | |||工作线程 | |保存 | |饲料工作|--->>||| |--->>|输出 | | | |||工作 | | | +------------+ +|| | +------------+ +| | +-----------------+每个框代表一个单独的线程。它们之间的箭头是“工作”对象流经的线程安全队列。 “获取并提供工作”线程从数据库中提取等待工作并将其提供给工作线程池。这些工作线程做一些工作,更新工作对象上的状态标志(并将其存储到数据库中)以及产生一些输出对象。输出对象流向“保存输出”线程,在那里它们在数据库中保存和/或更新。
这种架构的目的主要是为了提高排队效率。
我需要“Get and Feed Work”线程拥有自己的数据库会话/连接,以便它可以不断地从数据库中读取、解除阻塞并将该数据提供给工作线程。
每个工作线程还需要他们自己的数据库连接/会话,主要是为了更新他们在数据库中处理他们正在处理的任何任务的进度。这些数据库连接/会话始终是低影响的、不经常更新的。每个工作线程都会产生一些重要的东西,需要插入到数据库中。它不是每个工作线程都执行自己的插入操作,而是将该责任下放到“保存输出”线程。
“保存输出”线程通过批量写入数据库来提高效率 - 批量插入比一次插入要快得多。
我开始认为 Hibernate 可能不适合这种架构。
我发现自己在处理 Hibernate 会话时遇到了很多问题,驱逐、合并、清除、刷新,哦,天哪。
我的架构目前看起来很稳定,但也似乎效率极低。放弃Hibernate而直接使用JDBC会不会更好?
【问题讨论】:
标签: java multithreading hibernate persistence