Hibernate多线程和同步

时间:2011-01-04 10:38:32

标签: hibernate

我有以下代码:

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
try {
Configuration cfg = new Configuration();

cfg=cfg.configure();
sessionFactory = cfg.buildSessionFactory();
} catch (Throwable ex) {
    System.out.println("** Initial SessionFactory creation failed: " + ex.getMessage());
throw new ExceptionInInitializerError(ex);
}
}
public static final ThreadLocal hibernateSession = new ThreadLocal();

public static Session currentSession() {
    Session s = (Session) hibernateSession.get();
    if (s == null) {
        s = sessionFactory.openSession();
        //System.out.println("sessionFactory.openSession()");
        hibernateSession.set(s);
    }
    return s;
}

public static void closeSession() {
    Session s = (Session) hibernateSession.get();
    if (s != null)
        s.close();
    hibernateSession.set(null);
}
}

另外

public class Db {
    public static synchronized void Insert(Object updateBean) {
    org.hibernate.Session hibernateSession = HibernateUtil.currentSession();
    try {
        Transaction tx = hibernateSession.beginTransaction();
        hibernateSession.save(updateBean);
        tx.commit();
    } catch(Exception e) {
        System.out.println("*hibernate insert Exception: "+e.getMessage());
    }

    HibernateUtil.closeSession();
}
}

Hibernate正在使用c3p0池。 然后从繁忙的服务器生产环境中的JSP页面调用Db.Insert。

我的问题是,如果我删除Db.Insert(Object)上的'synchronized'会导致问题吗?

我意识到这是我最有可能已经知道的事情,但是不要也不想尝试并且出错。

此外,如果它可能导致上述问题,那么我不确定我是否理解使用c3p0进行连接池的问题......我现在的理解是调用HibernateUtil.currentSession();或者hibernateSession.beginTransaction();从c3p0池中调用一个可用的连接,而不是twain应该满足。

很抱歉第一段代码没有显示'代码',这个网页表格不想正常工作。

感谢您阅读

1 个答案:

答案 0 :(得分:1)

如果删除synchronized实际上您的应用程序可能只是执行得更好,那么不会有任何问题。

取决于您的休眠配置。 Hibernate将在会话的生命周期或事务的生命周期内从池请求连接。