1

我正在使用 Hibernate 构建我的第一个 Java 应用程序,并且在使用 Hibernate 会话时遇到了一些问题。

我的问题:当第二个用户登录到应用程序时,他会覆盖第一个用户的会话 -> 现在两者都在处理第二个会话。尽管两个用户在登录时都创建了一个新的会话。

我的代码:

首先我在用户登录时获取当前用户(LoginDetail.java):

userBean = UserProxy.getInstance().getElementByUser(userBean.getUser(), userBean.getPassword());

用户代理.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>

谁能给我一个提示如何解决这个问题?

4

1 回答 1

2

就我而言,创建会话是一种轻量级操作(Hibernate 文档),因此每次需要它时创建新会话不会对性能造成影响,除非您要使用它,让我们说每秒超过 100 次。正确的方法是您的 HibernateUtil 不返回会话,而是返回会话工厂。SessionFactory 是 ThreadSafe 的,所以不用担心并发。您应该使用工厂为您的请求创建新会话,查询数据库并关闭它以将连接返回到休眠的连接池。图案:

  1. 获取工厂
  2. 公开课
  3. 查询您的数据库
  4. 关闭会话
于 2013-08-06T15:51:44.180 回答