奇趣技术网 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 技术论坛
中华网络安全联盟 >> 程序开发 >> Java >> Hibernate 使用外部 Connection 的问题
程序开发
Asp
PHP
JSP
CGI/Perl
XML
.Net
C/C++/C#
Visual Basic
Visual C++
Delphi
Java
汇编语言
  • Tomcat5.0.28下AXIS完

  • JSP环境的配置过程(J

  • 用JAVA写一个日志类程

  • 实现Hibernate分页查询

  • Struts + Hibernate 代

  • 利用Eclipse开发Hiber

  • Java开源项目Hibernat

  • 从Hibernate2到3移植的

  • Hibernate 使用外部 Connection 的问题
    字体:

    中华网络安全联盟    作者:佚名    来源:网络转载    时间:2006-3-21

     最近在一个项目中试用了 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代码://小新技术网www.xker.com
      
      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 能看到.解释一下.
    字体:
     
    设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
    Copyright©2006-2008 中华网络安全联盟 All rights reserved.