Hibernate Session已关闭

时间:2010-03-04 10:45:59

标签: hibernate session

当我按如下方式调用方法session.begin事务时:

//session factory is instantiated via a bean
Session session = this.getSessionFactory().getCurrentSession();
session.beginTransaction();

然后我收到以下异常消息

6:13:52,217 ERROR [STDERR] org.hibernate.SessionException: Session is closed!
at org.hibernate.impl.AbstractSessionImpl.errorIfClosed(AbstractSessionImpl.java:49)
at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1319)

导致此错误的原因是什么?

8 个答案:

答案 0 :(得分:25)

更新:我猜调用getCurrentSession()并不能保证会话实际上是开放的。这是第一次,你应该使用

Session session = this.getSessionFactory().openSession();
session.beginTransaction();

代替。此建议实际上与您找到的页面一致。

<强>早些时候:

根据目前可获得的信息,我们可以得出结论,错误的原因是会话没有打开; - )

答案 1 :(得分:7)

我想我找到了答案:

Session is Closed

我还没有实现它

答案 2 :(得分:4)

您可以在控制器方法上使用此注释:

@Transactional(readOnly = true)

答案 3 :(得分:1)

在完成其他交易之前,您可以使用session.disconnect(),执行其他工作,然后执行session.reconnect(),而不是完全关闭会话。

session.close()将在请求/业务流程的最后调用。

在Hibernate 2.1.8中,我们每个请求模型使用一个会话,它运行良好,避免会话泄漏等。

有关详细说明,请参阅here

答案 4 :(得分:0)

这可能是原因

session.close();
tx.commit();

正确的方法是:

tx.commit();
session.close();

答案 5 :(得分:0)

一年前我有同样的Hibernate Session Closed Problem。 MY QUESTION

但是出于不同的原因,我把它放在这里,万一有人面临这个问题,想要了解更多。

答案 6 :(得分:0)

要处理会话已关闭的异常:

1-)在您的hibernate.cfg文件中,将默认的hibernate.current_session_context_class更改为managed而不是thread

2-)创建两个方法来正确打开和关闭会话,并使用如下所示的查询前后:

 public static void renewSession() {
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            session.setFlushMode(FlushMode.MANUAL);
             ManagedSessionContext.bind(session);
             session.beginTransaction();
       } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public static void closeSession()
    {
       try {
       ManagedSessionContext.unbind(HibernateUtil.getSessionFactory());
                  session.flush();
                 session.getTransaction().commit();
            session.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

用法:

try {
                renewSession();
                String query = "from Table tb";
               data = (List<TypeObject>)session.createQuery(query).list();
                closeSession();
            } catch (Exception e) {
                e.printStackTrace();
            }

答案 7 :(得分:0)

以下解决方案对我有用:

   ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-76-9d98d7b11202> in <module>
      2 from sklearn.neighbors import KNeighborsClassifier
      3 
----> 4 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
      5 
      6 print(X_train)

~/opt/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py in train_test_split(*arrays, **options)
   2094         raise TypeError("Invalid parameters passed: %s" % str(options))
   2095 
-> 2096     arrays = indexable(*arrays)
   2097 
   2098     n_samples = _num_samples(arrays[0])

~/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py in indexable(*iterables)
    228         else:
    229             result.append(np.array(X))
--> 230     check_consistent_length(*result)
    231     return result
    232 

~/opt/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py in check_consistent_length(*arrays)
    203     if len(uniques) > 1:
    204         raise ValueError("Found input variables with inconsistent numbers of"
--> 205                          " samples: %r" % [int(l) for l in lengths])
    206 
    207 

ValueError: Found input variables with inconsistent numbers of samples: [24946, 22451400]