资讯   |   开发   |   选机中心   |   产品大全 | IBM | 惠普 | 联想 | 戴尔 | 苹果 | 神舟
更多: | 华硕 | 明基 | 方正 | 紫光 | TCL | 夏新 | 联宝 | 宏碁 | 七喜 | 长城 | 清华同方 | 海尔 | 三星 | 东芝 | 索尼 | 富士通 | LG | 技术 | ddnoon
当前位置:笔记本 > 软件开发 >
Advertisement
文章正文

并发人数一多的话为什么会当机,以下是关键程序代码,希望各位兄弟能帮忙分析一下,或许互有裨益!谢谢捧场!!

类型:转载   责任编辑:asp.net   日期:2007/05/23


热门软件下载:


   

如果在线人数有上百人的话,就会当掉。  
   
  为了防止程序中有连接没有关闭,  
  我在代码中加了一个连接的管理,  
  如果连接数超过29个,  
  就关闭所有连接,  
  再重新取,  
  但问题依旧,  
  所以来这里恳请请各位兄弟的帮忙了!  
   
  关键是请各位兄弟分析一下以下代码的缺点,包括逻辑思路,语法的定义使用等哪里还存在问题!  
   
  package   com.xindeco.common.dbconn   ;  
   
  import   java.sql.*   ;  
  import   javax.sql.*   ;  
  import   java.util.*   ;  
  import   java.io.*   ;  
  import   javax.naming.*   ;  
   
  public   class   DbConn  
  {  
   
        public   ResultSet   rs   =   null   ;  
        public   Statement   stmt   =   null   ;  
        private   CustomizedResultSet   crs   =   null   ;  
        public   Connection   conn   =   null   ;  
        static   private   Hashtable   pools   =   new   Hashtable();   //存放DB连接  
        static   private   ArrayList   vector   =   new   ArrayList();   //存放标志  
        static   private   int   x   =   0;   //存放标志  
   
        private   long   lt   ;  
        private   long   lt1   ;  
   
        public   DbConn   ()  
        {  
                  this.getConnByWeblogicPool   ()   ;  
        }  
   
        //根据txdatasource的JNDI取得conn  
        private   void   getConnByWeblogicPool   ()  
        {  
                String   url   =   ""   ;  
                String   user   =   ""   ;  
                String   password   =   ""   ;  
                  DataSource   ds   =   null   ;  
                  Context   ctx   =   null   ;  
   
                  try  
                  {  
    //如果正在使用的连接超过29个,将全部关闭  
          if(x   >   29){  
                      for(int   i   =   0;   i<vector.size();){  
    Object   o   =   pools.get(vector.get(i));  
    Connection   c   =   (Connection)o;  
    if(c!=null   &&   !c.isClosed()){  
          x--;  
          //System.out.println   ("关闭无效连接后还剩下x="+x);  
          pools.remove(vector.get(i));  
          vector.remove(i);  
          c.close   ()   ;  
      }  
    }  
            }  
   
            ctx   =   this.getInitialContext   ()   ;  
            ds   =   (javax.sql.DataSource)   ctx.lookup   ("graduate")   ;  
            synchronized(this){  
    conn   =   ds.getConnection   ()   ;  
    if   (conn   !=   null)  
    {  
          ++x;  
          //System.out.println   ("建立连接个数xxxx="   +   (++x))   ;  
        lt   =   System.currentTimeMillis();  
        vector.add(String.valueOf(lt));  
          pools.put(String.valueOf(lt),conn);  
          stmt   =   conn.createStatement  
        (  
    ResultSet.TYPE_SCROLL_SENSITIVE,  
    ResultSet.CONCUR_READ_ONLY  
          )   ;  
      }  
                }  
          }  
          catch   (Exception   e)  
          {  
                                    throw   e;  
          }  
   
  }  
   
  static   final   private   Context   getInitialContext   ()  
  throws   Exception  
  {  
   
  Properties   properties   =   null   ;  
   
  try  
  {  
  properties   =   new   Properties   ()   ;  
  properties.put   (Context.INITIAL_CONTEXT_FACTORY,  
  "weblogic.jndi.WLInitialContextFactory")   ;  
  return   new   InitialContext   (properties)   ;  
  }  
  catch   (Exception   ex)  
  {  
  //ex.printStackTrace   ()   ;  
  throw   ex   ;  
  }  
  }  
   
   
  synchronized   public   void   close   ()  
  {  
  try  
  {  
  if   (stmt   !=   null   &&   !conn.isClosed   ())  
  {  
  stmt.close   ()   ;  
  stmt   =   null   ;  
  }  
  if   (stmt1   !=   null   &&   !conn.isClosed   ())  
  {  
  stmt1.close   ()   ;  
  stmt1   =   null   ;  
  }  
  if   (rs   !=   null   &&   !conn.isClosed   ())    
                                  {  
  rs.close   ()   ;  
  rs   =   null   ;  
  }  
  if   (conn   !=   null   &&   !conn.isClosed   ())  
  {  
  pools.remove   (String.valueOf   (lt))   ;  
  vector.remove   (String.valueOf   (lt))   ;  
  conn.close   ()   ;  
  conn   =   null   ;  
  --x;  
    //System.out.println   ("关闭后还剩连接个数111xxxx="   +   (--x))   ;  
  }  
  }  
  catch   (Exception   ex)  
  {  
  //ex.printStackTrace   ()   ;  
  }  
  }  
   
  }  
   
 

网友回答:

发表者:viano

 
   
  当机的可能原因会是你的应用服务器   承受能力有限   导致的!  
   
 

发表者:floweryz

你没有写进程,

发表者:znjq1001

考虑你的机器配置,考虑你的应用服务器,重要的是考虑你的程序。

发表者:viano

 
   
  weblogic   提供的连接池程序应该够用了。      
   
  你的并发用户有几百个   那么建议你的最大连接数还是大一点好,程序容易当机那么有些耗时的操作你可以  
   
  放在其他的机器上处理。  
   
  其实我们应用程序优化的最终问题都会集中在数据库操作上!  
   
  通常用   tomcat   的时候可能出现你说的问题,但是最先考虑的是   程序问题,   检查检查你的程序估计程序哪里  
   
  没有优化好,负载大的地方应该想象用一些特殊的方法处理,如果这些数据只是读取性数据那么你就没有必要  
   
  经常读取数据库,你可以在服务器启动的时候最先读入存入hashtable   里面或者其他对象池,这样就减轻了  
   
  数据库的负载。  
   
  你说的问题不是很清楚,所以没有办法给你说的再具体点,当然我的能力也有限,共同进步     :)!

发表者:0210

我发现weblogic在用户多的时候容易死,以前用tomcat反而不会

发表者:vongood

gz

发表者:lazy_du

你的用法很古怪,而且过时,用weblogic自己带的连接池就可以了啊  
  我的web检索应用刚刚通过了400并发测试,不理解你为什么不用通用的做法  
  dataSource   =   (DataSource)   ic.lookup(dataSourceName);  
  非常简单  
   
  static   private   Hashtable   pools   =   new   Hashtable();   //存放DB连接  
  static   private   ArrayList   vector   =   new   ArrayList();   //存放标志  
  你存放这些干嘛,连接都在weblogic管理的连接池中啊  
   
   
 

发表者:gong1

建议直接用weblogic的连接池。  
  ^_^  
  还有就是weblogic是不是没有问题,  
  还是???  
 

发表者:cold_blooded

能吧Log贴出来么

发表者:bt_yy_rpwt

synchronized(this){  
  这个写了又没用的  
  你是new一个的,this又不一样  
   
  取连接的代码呢。


 

 
热门推荐笔记本: IBM笔记本
相关文章:
webmaster:popbb@126.com   最佳浏览:1024X768 MSIE
©2007 popbb.net All Rights Reserved