Java 休眠:清理会话
假设我有以下几点:Java 休眠:清理会话,java,multithreading,hibernate,session,thread-safety,Java,Multithreading,Hibernate,Session,Thread Safety,假设我有以下几点: public class DAOFactory { @Inject private final SessionFactory factory; private final ThreadLocal<Session> session = new ThreadLocal<>(); // In a nutshell: create an AbstractDAO associated with the session object he
public class DAOFactory {
@Inject private final SessionFactory factory;
private final ThreadLocal<Session> session = new ThreadLocal<>();
// In a nutshell: create an AbstractDAO associated with the session object held by the ThreadLocal above
public <T> AbstractDAO<T> createObject(Class<T> objectClass) { ... }
}
问题是“这种方法有多安全”、“这是一个好主意”和“应该这样做吗”?如果没有,什么是好的选择
请注意,
DAOFactory
在很大程度上是在考虑某种测试情况的情况下创建的:一个线程启动测试运行并创建一个DAOFactory
,它可能会生成使用它的其他线程。创建DAOFactory
的线程总是比它生成的任何线程都要持久,并且总是在测试结束时调用cleanup()
。手动会话管理不是一个好主意。Hibernate已经提供了一个SPI,所以您不必自己做
我建议您开始使用Spring事务管理,它还提供自动会话管理
public class DAOFactory {
// createObject() uses Thread.getCurrentThread.getId() and sessionMap.computeIfAbsent()
private final ConcurrentMap<Long, Session> sessionMap = new ConcurrentHashMap<>();
public void cleanup() {
for (Session session : sessionMap.values()) {
session.close();
}
sessionMap.clear();
}
}