【发布时间】:2015-09-15 12:03:29
【问题描述】:
我正在使用simple-react。
在LazyFutureStream里面我要持久化实体。
LazyFutureStream.parallel(1,2,3,4,5)
.map(id -> {
try {
SessionFactory sessionFactory = Application.getHibernateBundle()
.getSessionFactory();
ManagedSessionContext.bind(sessionFactory.openSession());
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
Model model = new Model(sessionFactory);
model.persist(id);
session.getTransaction().commit();
}
});
这是正确的吗?有什么办法可以跳过每个线程的会话工厂创建。
同样在上面我只想分叉而不是加入。可以吗?
【问题讨论】:
-
不,这是不正确的。您的
try块缺少catch或finally。除此之外,map操作通常应该 map 从一个项目/值到另一个,因此关联的函数必须返回一个值。如果您只是想消费物品,forEach可能是您的选择。如果您不想为每个项目创建新的 Session,请将其创建代码移出 lambda 表达式。 -
如果我将 Session 移出,那么它将被共享一个,这会导致一些关于线程并发的问题
-
我对 hibernate 的了解还不够多,不能说一下
Session类的线程安全。但万一不是,您总是可以将非线程安全组件的供应商包装到ThreadLocal中。这样,您可以安全地为每个线程创建一个,但仍会跳过由同一工作线程处理的项目的创建。但也许有人会就Session的线程安全给出一个明确的答案。同时,您可以尝试在其文档中搜索答案…… -
您的意思是 threadLocal.set(session) 将使会话对象独占它。类似的所有其他线程,。如果在线程本地设置,将为每个线程复制相同的会话对象
标签: hibernate java-8 cyclops-react