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();
    }
}