我正在使用Hibernate构建我的第一个Java应用程序,并且Hibernate Sessions有点问题。
我的问题: 当第二个用户登录到应用程序时,他会覆盖第一个用户的会话 - >他们现在正在第二次会议上工作。虽然两个用户在登录时都会创建一个新会话。
我的代码:
首先我在用户登录时获取当前用户(LoginDetail.java):
userBean = UserProxy.getInstance().getElementByUser(userBean.getUser(), userBean.getPassword());
UserProxy.java:
public static synchronized UserProxy getInstance() {
if (instance == null) {
instance = new UserProxy();
}
return instance;
}
public UserBean getElementByUser(String user, String password) {
try {
Iterator<SUsers> iter = s.createQuery("from SUsers where user = '" + user + "' and password = '" + password + "'").list().iterator();
while (iter.hasNext()) {
userDB = iter.next();
currentUser = convertClassToBean(userDB);
log.debug("aktuell ausgewaehlter char: " + userDB.getId());
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
}
currentUser = convertClassToBean(userDB);
return currentUser;
}
我的HibernateUtil.java:
public static final ThreadLocal<Session> session = new ThreadLocal<Session>();
public static Session currentSession() {
Session s = session.get();
// Open a new Session, if this Thread has none yet
if (s == null) {
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
和hibernate.cfg.xml:
<property name="connection.pool_size">1</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="current_session_context_class">thread</property>
<property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">update</property>
<property name="hibernate.connection.isolation">2</property>
任何人都可以给我一个如何解决这个问题的提示吗?
答案 0 :(得分:1)
就我而言,创建会话是一个轻量级的操作(Hibernate docs),所以每次你创建新会话都不会影响性能。除非你使用它只能说每秒超过100次。 正确的方法是你的HibernateUtil不返回会话,但是会话工厂已经加密。 SessionFactory是ThreadSafe所以不要担心bout concurency。您应该使用factory,query DB为您的请求创建新会话,并关闭它以返回到hibernates连接池的连接。图案: