例子如下:
有两个类:
class A{
private Session ses;
public A()                  //构造方法打开session
{
Configuration cfg=new AnnotationConfiguration().configure();
SessionFactory sf=cfg.buildSessionFactory();
this.ses=sf.getCurrentSession();
ses.beginTransaction();}public int fuctionA(Object o){    此方法为返回一个整数。中间代码省略大部分。
int i=0;
....             
ses.createQuery(sql);
....
ses.getTransation().comit();return i ;}
}
class B{
private Session ses;
public B()                  //构造方法打开session
{
Configuration cfg=new AnnotationConfiguration().configure();
SessionFactory sf=cfg.buildSessionFactory();
this.ses=sf.getCurrentSession();
ses.beginTransaction();}public int fuctionB(Object o){                 
A a=new A();
int i=a.functionA(o);
ses.getTransation().comit();  
return i;
}
}然后在action中写下
B b=new B();
b.functionB(Object o);这样写行不行?也就是在一个session有另外一个session
我写了一个类似的代码。运行很多次都行,但是不知为什么突然不行。连接的是oracle
报错:流已经关闭。

解决方案 »

  1.   

    getCurrentSession是获取当前线程的session,所以一直都是一个,不知道你的“流已经关闭”在哪出来的,希望你贴出完整的异常,或许还应该贴出代码,而不是......
      

  2.   

    我觉得不行,因为你在实例化B时已经有了一个session而那个session没有关闭,你又开了一个session,一般session都是单例模式,同时开两个session难免有些地方会出错
      

  3.   

    这样做是可以的, 因为这两个session是从两个factory中创建的. 但是有两个问题:
    1. 耗时. buildFactory()是一个非常耗时的动作. Hibernate说的是只要建立一次factory, 以后就可以从这个factory中多次取得session使用. buildFactory时, 会建立数据库连接缓冲池(比如20个连接).
    2. buildFactory()后, 没有关闭. 这样每调用一次, 数据库服务器就会建立比如20个连接(B的)+20个连接(A的), 多调用几次后, 数据库服务器就会拒绝连接了.