Hibernate многопоточность и синхронизация - PullRequest
0 голосов
/ 04 января 2011

У меня есть следующий код:

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. Затем Db.Insert вызывается со страниц JSP в производственной среде занятого сервера.

У меня вопрос: если бы я удалил «synchronized» в Db.Insert (Object), это вызвало бы проблемы?

Я понимаю, что это то, что я, скорее всего, уже должен знать, но не знаю и не хочу пробовать это и получать ошибки.

Также, если это может вызвать указанные проблемы, тогда я не уверен, что понимаю смысл использования c3p0 для пула соединений ... На данный момент я понимаю, что вызывает HibernateUtil.currentSession (); или hibernateSession.beginTransaction (); вызывает доступное соединение из пула c3p0 и никогда не встречается между ними.

Извините за то, что первый бит кода не отображается 'code', эта веб-форма просто не хочет работать правильно.

Спасибо за чтение

1 Ответ

1 голос
/ 04 января 2011

Не будет никаких проблем, если вы удалите synchronized, на самом деле ваше приложение может работать немного лучше.

В зависимости от конфигурации гибернации.Hibernate запросит соединение из пула либо на время жизни сеанса, либо на срок действия транзакции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...