i与Hibernate Sessions在多线程模式下使用PostgreSQL。init:
<property name="connection.driver_class">org.postgresql.Driver</property>
<property name="hibernate.current_session_context_class">thread</property>
(其他字符串是连接URL和实体XML描述))
Hibernateutil:
public class HibernateUtil {
private static SessionFactory sessionFactory;
static {
try {
Configuration configuration = new Configuration();
configuration.configure();
sessionFactory = configuration.buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory() {
return sessionFactory;
}
public static Session getSession() {
return sessionFactory.getCurrentSession();
}
public static void close() {
sessionFactory.close();
}
public static void setSessionFactory(SessionFactory factory) {
sessionFactory = factory;
}
}
我在我在单独的类中执行的实体的所有CRUD动作,其中每个动作都在一次交易中执行。
public class SessionService {
public static <T> T get(Class<T> classvar, int id) {
Session session = HibernateUtil.getSession();
session.beginTransaction();
T result = session.get(classvar, id);
session.getTransaction().commit();
return result;
}
// Some other code
public static void update(Object obj) {
Session session = HibernateUtil.getSession();
session.beginTransaction();
session.update(obj);
session.getTransaction().commit();
}
}
多线程工作没有问题(或者我看不到)。但是,一段时间以前,我看到了奇怪的虫子。我从sessionservice.get(Entity.Class,1)中获得了DB的一张记录。更改该实体的一个字段,并通过sessionservice.update(实体)保存它。更新是成功完成的,没有例外(已批准的记录)。但是在数据库中看不到的变化。在运行时实体具有此更改,但在DB中没有。我等待一段时间(潮红和其他),但没有任何改变。试图重复错误 - 所有的错误,找不到错误。有一天,我在生产服务器上捕获了该错误,其中有19个对象,但在其他日子里,我没有看到此错误。最后的时刻:我看不到t catched this bug with other entities (or i don
t)。
可能是什么原因?更好地使用实体管理器而不是会议?
您可以发布整个Hibernate.cfg.xml文件(当然要删除用户名和密码)。另外,您是否100%确定您不会遇到错误(Wild Guess)这样的错误:会话已经关联的具有相同标识符值的其他对象?
运行冬眠时存在错误,在运行查询时,该文学在控制台中闪烁了半秒。有一段时间有这个问题。