我的软件使用多个线程来完成它的工作。有一条管道看起来像这样:
+-----------------+
|+-----------------+
+------------+ ||+-----------------+ +------------+
| | ||| | | |
| Get and | ||| Worker Threads | | Save |
| feed work |--->>||| |--->>| Output |
| | ||| Do Work | | |
+------------+ +|| | +------------+
+| |
+-----------------+
每个框代表一个单独的线程。它们之间的箭头是线程安全队列,供“工作”对象通过。“获取并馈送工作”线程从数据库中提取等待的工作,并将其馈送到工作线程池中。这些工作线程执行一些工作,更新工作对象上的状态标志(并将其存储到db)以及生成一些输出对象。输出对象流到“Save output”线程,在那里它们在数据库中被保存和/或更新。
这种体系结构的主要目的是提高排队效率。
我需要“Get and Feed Work”线程拥有自己的DB会话/连接,这样它就可以连续地从DB读取数据,解除阻塞,并将数据提供给工作线程。
“Save Output”线程通过成批执行来提高向数据库的写入效率—成批插入比一次一个插入快得多。
我开始认为Hibernate可能不适合这种架构。
我发现自己在处理休眠会话、逐出、合并、清除、刷新时遇到了很多问题。