使用不同的用户休眠多个会话

时间:2013-08-06 14:51:50

标签: java hibernate session

我正在使用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>

任何人都可以给我一个如何解决这个问题的提示吗?

1 个答案:

答案 0 :(得分:1)

就我而言,创建会话是一个轻量级的操作(Hibernate docs),所以每次你创建新会话都不会影响性能。除非你使用它只能说每秒超过100次。 正确的方法是你的HibernateUtil不返回会话,但是会话工厂已经加密。 SessionFactory是ThreadSafe所以不要担心bout concurency。您应该使用factory,query DB为您的请求创建新会话,并关闭它以返回到hibernates连接池的连接。图案:

  1. 出厂
  2. 开放会话
  3. 查询您的数据库
  4. 关闭会话