gpt4 book ai didi

java - hibernate 具有不同用户的多个 session

转载 作者:行者123 更新时间:2023-11-30 04:17:11 24 4
gpt4 key购买 nike

我正在使用 Hibernate 构建我的第一个 Java 应用程序,并且 Hibernate session 存在一些问题。

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

我的代码:

首先,当用户登录时,我获取当前用户(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>

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

最佳答案

就我而言,创建 session 是一项轻量级操作(Hibernate 文档),因此每次需要时创建新 session 不会对性能造成影响,除非您要使用它(假设每秒超过 100 次) 。正确的方法是 HibernateUtil 不返回 session ,而是返回 session 工厂。 SessionFactory 是线程安全的,所以不用担心并发问题。您应该使用工厂、查询数据库为您的请求创建新 session ,然后关闭它以将连接返回到 Hibernate 的连接池中。图案:

  1. 获取工厂
  2. 公开 session
  3. 查询您的数据库
  4. 关闭 session

关于java - hibernate 具有不同用户的多个 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18083538/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com