EntityManager 真的是线程安全的吗?
我在这里谈论的是基本用法:
@Stateless
public class BookServiceBean implements BookService {
@PersistenceContext EntityManager em;
public void create(Book book) { this.em.persist(book);}
}
谷歌搜索上面的问题,StackOverflow说是,但不是 - 接受的答案说是,但后续是否;Spring.io 说“是”和“否”,而亚当·比恩(Adam Bien)似乎是Java EE专家,他给出了一个不合格的“是”。
我自己对一个简单的预定豆子的经验表明,答案是否定的:
@Stateless
public class TimerTick implements TimerTickAbs, Runnable {
@PersistenceContext private EntityManager entityManager;
@Override
public void run() {
Query q = entityManager.createQuery("SELECT blah...");
}
@Override
public Runnable runner() {
return this;
}
}
抽象接口:
@Local
public interface TimerTickAbs {
public Runnable runner();
}
开头为:
@Resource ManagedScheduledExecutorService managedExecutorService;
@EJB TimerTick myRunner;
public void startup()
{
managedExecutorService.scheduleAtFixedRate(myRunner.runner(), 3, 40, TimeUnit.SECONDS);
}
如果我打印出 ,即使我在两次调用之间仍然在同一线程上,我得到:Thread.currentThread().getId()
SEVERE: java.lang.IllegalStateException: 试图在已关闭的 EntityManager 上执行操作
我知道我可以像自己一样做代码和管理,但我想利用所有自动事务的东西。@PersistenceUnit private EntityManagerFactory emf;
EntityManager
@PersistenceContext