1

Hibernate を使用して最初の Java アプリケーションを構築していますが、Hibernate セッションに少し問題があります。

私の問題: 2 番目のユーザーがアプリケーションにログインすると、最初のユーザーのセッションが上書きされます -> 両方が現在 2 番目のセッションで作業しています。ログイン時に両方のユーザーが新しいセッションを作成しますが。

私のコード:

最初に、ユーザーがログインしたときに現在のユーザーを取得します (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>

この問題を解決する方法を誰かに教えてもらえますか?

4

1 に答える 1

2

私に関する限り、セッションの作成は軽量の操作 (Hibernate docs) であるため、必要なたびに新しいセッションを作成してもパフォーマンスが低下することはありません。これの適切な方法は、HibernateUtil がセッションを返さず、代わりにセッション ファクトリを返すことです。SessionFactory は ThreadSafe であるため、同時実行性について心配する必要はありません。ファクトリを使用してリクエスト用の新しいセッションを作成し、DB をクエリし、それを閉じて接続を休止状態の接続プールに戻す必要があります。パターン:

  1. ファクトリを取得
  2. セッションを開く
  3. DB にクエリを実行する
  4. セッションを閉じる
于 2013-08-06T15:51:44.180 に答える