CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 扩展类

tomcat 连接池的一个超级bug!!!

楼主studyman666(studyman)2006-07-03 00:29:37 在 Java / J2SE / 扩展类 提问

下面是一个servlet   里的   doPOST   方法的代码  
   
  我tomcat   连接池   maxActive   =8     结果执行8次后   就无法得到   Connection了(为null)而且getConnection变得很慢(等于maxWait设置的时间)  
   
  如果我   maxActive   设置为4     那么就四次以后不行     我每次都很小心的关闭   为什么关闭的Connection无法再利用??  
  ==================================================  
  protected   void   doPost(HttpServletRequest   request,   HttpServletResponse   response)   throws   ServletException,   IOException   {  
  String   keyword   =   request.getParameter("keyword");  
  boolean   hasData   =   false;  
   
  Context   ctx=null;  
  Connection   conn=null;  
  Statement   stmt=null;  
  ResultSet   rs=null;  
   
  try{  
  ctx=new   InitialContext();  
  DataSource   ds=(DataSource)ctx.lookup("java:comp/env/jdbc/sample");  
  if(ds!=null){  
  conn=ds.getConnection();//问题所在!  
  }  
  if(conn   !=   null){  
  HttpSession   session   =   request.getSession();  
  session.setAttribute("sou4sou_keyword",keyword);  
   
  stmt   =   conn.createStatement()   ;  
  rs   =   stmt.executeQuery("select   top   1   id   from   searchdata   where   keyword   like   '%"+keyword+"%'");  
  System.out.println("select   top   1   id   from   searchdata   where   keyword   like   '%"+keyword+"%'");  
  if(rs.next()){  
  hasData   =   true;  
  }  
  }  
  rs.close();  
          rs   =   null;  
          stmt.close();  
          stmt   =   null;  
          conn.close();   //   Return   to   connection   pool  
          conn   =   null;    
  }catch(Exception   e){  
  e.printStackTrace();  
  }finally{  
  try{  
  if   (rs   !=   null)   {  
  try   {   rs.close();   }   catch   (SQLException   e)   {   ;   }  
  rs   =   null;  
  }  
  if   (stmt   !=   null)   {  
  try   {   stmt.close();   }   catch   (SQLException   e)   {   ;   }  
  stmt   =   null;  
  }  
  if   (conn   !=   null)   {  
  try   {   conn.close();   }   catch   (SQLException   e)   {   ;   }  
  conn   =   null;  
  }  
   
  }catch(Exception   e){  
   
  }  
   
  }  
  ServletContext   sc   =   getServletContext();  
  RequestDispatcher   rd   =   null;    
  if(hasData){  
  rd   =   sc.getRequestDispatcher("/list.jsp");  
  rd.forward(request,response);  
  }else{  
  rd   =   sc.getRequestDispatcher("/souproxy.jsp");  
  rd.forward(request,response);  
  }  
  }          
   
   
  ================================================== 问题点数:100、回复次数:17Top

1 楼treeroot(旗鲁特)回复于 2006-07-03 09:13:41 得分 0

有这样的事?Top

2 楼amoon0724(套袖)回复于 2006-07-03 21:48:02 得分 0

有没有线程?  
  Top

3 楼kongxiangli(笑看红尘)回复于 2006-07-06 09:32:05 得分 0

应该不会啊,Top

4 楼ranranhu(魑狂鬼魅)回复于 2006-07-06 11:29:28 得分 0

没试过Top

5 楼OnlyFor_love(『勾勾手指头 一辈子不分手』)回复于 2006-07-08 15:52:04 得分 0

每次close之后   不要在设置为null了Top

6 楼synico(Keep it simple stupid)回复于 2006-07-08 16:05:48 得分 0

每次close之后   不要在设置为null了  
  ++++++++++++++++++++++++++++++++++  
  有关系么?操作的对象又不是的引用都交掉了吧Top

7 楼OnlyFor_love(『勾勾手指头 一辈子不分手』)回复于 2006-07-08 16:17:35 得分 0

就拿conn来说,如果光是close的话,那close之后conn是什么??     是null吗?Top

8 楼OnlyFor_love(『勾勾手指头 一辈子不分手』)回复于 2006-07-08 16:23:37 得分 0

tomcat   连接池的一个超级bug????????????????  
   
  首先你要认识到,数据库连接池这么好的一个东西,在推出来之前一定是做过很多测试的。  
   
  这么关键的地方出现bug的几率几乎为零Top

9 楼synico(Keep it simple stupid)回复于 2006-07-08 18:10:32 得分 0

请教一下,确实不知道conn.close()后conn是什么,看过人家的代码,在关闭链接的时候都是:  
  if(null!=conn)  
        conn.close();  
   
  关于conn.close()所做的工作,不知道,感觉跟将conn=null后,getConnection()并不是立即为空,请楼上的解释下,说说清楚,谢谢了。  
  Top

10 楼xxu(焕兄)回复于 2006-07-08 23:10:26 得分 0

哈哈,这么大的BUG都被你找到了,TOMCAT还不完啦!Top

11 楼xxu(焕兄)回复于 2006-07-08 23:24:54 得分 0

你用的tomcat是哪个版本?放个最新版试试吧.Top

12 楼navence(卡西C)回复于 2006-07-08 23:30:06 得分 0

没碰到过这样的问题。关注。  
  楼主在最后ctx.close();试试看会不会在出现这个问题。  
  还有的话应该是数据库驱动的问题了。楼主的jdbc是什么呢?Top

13 楼loveyt(咆哮的独角兽^大家都在长大)回复于 2006-07-10 12:57:03 得分 0

果然超级~!Top

14 楼terry_yip(我只回答引起我思考的问题)回复于 2006-07-10 17:59:30 得分 0

你把   if(conn   !=   null)改为if(!conn.isClose())试试吧,你的代码没什么问题的,我想可能是你的工程中,有别的程序打一了连接没关导致。如果TOMCAT的连接池有这样明显的BUG,他早就修改了。  
  Top

15 楼happyxyzw(happyxyzw)回复于 2006-07-13 11:17:34 得分 0

这个不是BUG,我遇到过这个问题。建立连接时不要什么条件都不加就创建一个连接,关闭一定要小心,包括过程中关闭RS,STMT等对象时,看是否影响到连接的关闭等。可以解决!Top

16 楼zhmt(孜风)回复于 2006-07-14 13:27:13 得分 0

友情upTop

17 楼sos110(忙糊涂了)回复于 2006-07-16 03:44:50 得分 0

我们用java来解决实际问题。java技术交流,讨论java的技术细节和最新技术。欢迎中高级程序员以及渴望学习java技术的初学者加入讨论。QQ群:3001581  
  Top

相关问题

关键词

得分解答快速导航

  • 帖主:studyman666

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo