我的软件使用多个线程来完成其工作。有一个看起来像这样的管道:
+-----------------+ |+-----------------+ +------------+ ||+-----------------+ +------------+ | | ||| | | | | Get and | ||| Worker Threads | | Save | | feed work |--->>||| |--->>| Output | | | ||| Do Work | | | +------------+ +|| | +------------+ +| | +-----------------+
每个框表示一个单独的线程。它们之间的箭头是“工作”对象流过的线程安全队列。 “获取和提供工作”线程从数据库中提取等待工作并将其提供给工作线程池。这些工作线程做了一些工作,更新工作对象上的状态标志(并将其存储到数据库)以及生成一些输出对象。输出对象流向“保存输出”线程,在线程中保存和/或更新它们。
这种架构的目的主要是排队效率。
我需要“Get and Feed Work”线程拥有自己的数据库会话/连接,以便它可以连续读取数据库,解锁并将数据提供给工作线程。
每个工作线程还需要自己的数据库连接/会话,主要是在他们正在处理的任何任务中更新数据库中的进度。这些数据库连接/会话始终是低影响,不经常更新。每个工作线程产生一些重要的东西,需要插入DB。而不是每个工作线程都执行自己的插入,而是将该责任推到了“保存输出”线程。
“保存输出”线程通过批量执行来提高写入数据库的效率 - 批量插入比一次更快。
我开始认为Hibernate可能不适合这种架构。
我发现自己遇到了许多处理Hibernate会话,驱逐,合并,清算,刷新问题的问题。
我的架构目前似乎很稳定,但它看起来也非常低效。抛弃Hibernate并直接使用JDBC会不会更好?
答案 0 :(得分:1)
您可以分离在会话之间传递的对象,也可以只传递对象ID。
答案 1 :(得分:0)
从会话加载的Hibernate会话和对象不是线程安全的,因此它们不能被同时的不同线程访问,但是可以从不同的线程顺序访问它们。从你的过程描述来看,线程之间似乎没有重叠,所以你应该很好地传递对象和会话。
请确保不使用线程绑定会话,不要使用SessionFactory.getCurrentSession()