У меня есть следующий код:
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', эта веб-форма просто не хочет работать правильно.
Спасибо за чтение