服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

hibernate使用外部connection的问题


  最近在一个项目中试用了 hibernate . 因为项目分两部分来做,在另一个部分中,已经使用了一个连接池(自行开发的).现在两部分要合在一起,于是便出现了如下问题.
  开始,我们决定使用hibernate的外部连接方法进行数据访问:
  
  java代码:
  1
  2 public static dbsession opensession() {...}
  3   dbsession dbsession = null;
  4   try {...}
  5    //system.out.println("session is start");
  6    connectionpool connectionpool = pooledconnectionfactory.getconnectionpool();
  7    connection con = connectionpool.getconnection();
  8
  9    session s = (session) session.get();
  10    if (s == null) {...}
  11     s = fact.opensession(con);//在此,使用外部连接池所给的连接
  12     session.set(s);
  13    }
  14
  15    dbsession = new dbsession(s);
  16   } catch (throwable t) {
  17    string msg = "couldn't open a hibernate session for sessionfactory '" + "'";
  18    log.error( msg, t );
  19    throw new dbexception( msg + " : " + t.getmessage() );
  20   }
  21   return dbsession;
  22  }
  23
  
  关闭session方法如下:
  java代码:
  
  1
  2 public static void closesession() throws hibernateexception,exception{...}
  3     session s = (session) session.get();
  4     session.set(null);
  5     if (s != null){...}
  6       s.connection().close();
  7       s.close();
  8       system.out.println("session closing");
  9       //s = null;
  10
  11     }
  12   }
  13
  
  问题出现了.在我们很慢点击的访问下还好.只要稍刷的快些,便会出现 can't excute query 的错误.大概时在执行某一查询时, session中的connection为close.或 session 为空.很奇怪,也许是这种方法在快速并发访问时,会出现这个问题.其实在session.close()的时候,session是不会为空的..所以在此有些不理解.怎么会取到已经关闭的连接呢.不知道大家有没有遇到过.
  
  现在,我们有两种解决办法.
  一是,将前一部分的连接池注册为datasource,这样由hibernate调用.
  二是,将前一部分的连接池改为hibernate所带的dbcp等.
  这两种方法都不难更改.
  不过,只是不理解上述的bug.所以和大家讨论一下.也希望 robbin 能看到.解释一下.

扫描关注微信公众号