CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
英特尔®游戏设计大赛100美元现金周周送 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  Web 开发

Tomcat + SQL SERVER 2000 連接池(討論)

楼主Frank_Xu()2003-08-04 08:33:09 在 Java / Web 开发 提问

Tomcat中SERVER.XML配置:  
  <Context   path="/bizcity"   docBase="bizcity"   debug="0">  
      <Resource   name="jdbc/bizcity"   auth="Container"       type="javax.sql.DataSource"   />  
                          <ResourceParams   name="jdbc/bizcity">  
      <parameter><name>factory</name>  
  <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>  
  </parameter>  
  <parameter><name>driverClassName</name> <value>com.microsoft.jdbc.sqlserver.SQLServerDriver</value>  
  </parameter>  
                                  <parameter><name>url</name> <value>jdbc:microsoft:sqlserver://192.168.10.1:1433;DataBaseName=BizCity</value>  
                  </parameter>  
                                  <parameter><name>username</name><value>sa</value></parameter>  
                                  <parameter><name>password</name><value>123456</value></parameter>  
                                  <parameter><name>maxActive</name><value>20</value></parameter>  
                                  <parameter><name>maxIdle</name><value>10</value></parameter>  
                                  <parameter><name>maxWait</name><value>-1</value></parameter>  
                          </ResourceParams>  
  </Context>  
   
  代碼部分:  
  package   biz;  
   
  import   java.sql.*;  
  import   javax.sql.*;  
  import   java.util.Vector;  
  import   java.util.Date;  
  import   javax.naming.*;  
   
  public   class   connpool{   //   連接池類  
          private   int   maxconn;   //最大連接數  
          private   int   nActive;   //已創建的連接數  
          private   Vector   freeCons=new   Vector();   //存儲當前可用連接的數組  
   
          private   Context   initCtx   =   null;  
          private   Context   ctx   =null;  
          private   DataSource   ds=null;  
   
          public   connpool()  
          {  
                  this.maxconn=20;  
                  this.nActive   =0;  
                  try{  
                          initCtx   =   new   InitialContext();  
                          if(initCtx==null)   throw   new   Exception("Initial   Failed!");  
                          ctx   =   (Context)   initCtx.lookup("java:comp/env");  
                            //szJdbc="jdbc/bizcity"   此值在Tomcat的SERVER.XML文件中配置  
                          if(ctx!=null)     ds=   (DataSource)   ctx.lookup("jdbc/bizcity");  
                          if(ds==null)       throw   new   Exception("Look   up   DataSource   Failed!");  
                  }  
                  catch(Exception   e){  
                          System.out.println(e.getMessage());  
                  }  
          }  
   
          public   void   SetMaxConn(int   n){//默認最大連接數為   20   ~   200;  
                  if(n<20)     n=20;  
                  if(n>200)   n=200;  
                  this.maxconn   =n;  
          }  
   
          public   synchronized   void   freeConnection(Connection   con)   //歸還連接  
          {  
                  try{  
                          if(con.isClosed()){  
                                  con=null;         //System.out.println("Connection   is   Closed\n");  
                          }  
                          else{  
                                  freeCons.addElement(con);        
                                  System.out.println("Add   Exists   Connection,Current   Conut="   +   freeCons.size());  
                          }  
                  }  
                  catch(Exception   e){System.out.println(e.getMessage());}  
                  //notifyAll();  
          }  
   
          public   synchronized   Connection   getConnection(long   timeout)   //取得一個連接(指定超時時間)  
          {  
                  long   startTime=new   Date().getTime();   //記錄超時用  
                  Connection   con=null;  
                  while(con==null){  
                          if(freeCons.size()>0){//在有可用的連接時,選用可用連接  
                                  con=(Connection)   freeCons.firstElement();   //從數組中取得第一個  
                                  freeCons.removeElementAt(0);   //並從數組中刪除  
                                  try{  
                                      if(con.isClosed()){   //如果已關閉,則將已創建連接減一  
                                                  nActive--;  
                                                  con=null;  
                                          }  
                                  }  
                                  catch(Exception   e){System.out.println(e.getMessage());}  
                                  if(con!=null)   System.out.println("Get   Exists   Connection\n");  
                          }else   if(nActive<maxconn){   //沒有可用連接且已創建的連接數小于最大數時,創建新連接  
                                  con=newConnection();  
                                  if(con!=null)   System.out.print("Create   New   Connection   ******"   +   nActive   );  
                          }  
                          if(con!=null)   break;   //取得可用連接後,則直接退出等待  
                          //否則,進行等待0.5s,進行下一次獲取連接的操作  
                          try{  
                                  wait(500);   //等待0.5秒  
                          }  
                          catch(InterruptedException   e)   {}  
                          if((new   Date().getTime()-startTime)>=timeout){  
                                  System.out.println("Connection   timeout\n");  
                                  break;   //超時則退出  
                          }  
                  }  
                  return   con;  
          }  
   
          public   void   release(){   //關閉所有連接  
                  int   i=freeCons.size();  
                  int   j=0;  
                  for   (j=0;j<i;j++){  
                          Connection   con=(Connection)freeCons.elementAt(j);  
                          try{  
                                  con.close();  
                          }  
                          catch(SQLException   e)   {  
                                  System.out.println("無法關閉連接池中的當前連接");  
                          }  
                  }  
                  freeCons.removeAllElements();  
                  nActive=0;  
          }  
   
          private   Connection   newConnection(){   //創建一個新連接  
                  Connection   con=null;  
                  try{  
                          con=ds.getConnection();  
                          if(con==null)   throw   new   Exception("Create   Connection   Failed!");  
                          else   nActive++;  
                  }  
                  catch(Exception   e){  
                          System.out.println(e.getMessage());  
                  }  
                  return   con;  
          }  
  }  
   
   
  JSP調用:  
  <%@   page   language="java"   import="java.sql.*"%>  
  <jsp:useBean   id="vCon"   scope="application"   class="biz.connpool"/>  
   
  <%!  
          Connection   con=null;  
          java.sql.Statement   stmt=null;  
  %>  
   
  <%  
  try{  
          if(con==null)   con=vCon.getConnection(10000);   //最大等待時間為10s  
          stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);  
  }  
  catch(Exception   e){  
          System.err.println(e.getMessage());  
  }  
   
  ResultSet   rs=stmt.executeQuery("Select   *........");  
  ........  
   
  stmt.close();  
  vCon.freeConnection(con);  
  con=null;  
  %>  
   
   
   
  我已調試通過connpool.java,通過Get   Exists   Connection   和Create   New   Connection後台信息,查看取得的連接,通過Add   Exists   Connection後台信息查看歸還連接情況  
   
  不知大家有什麼好的連接池代碼,可以相互討論一下. 问题点数:100、回复次数:11Top

1 楼luckyfanjian(luckyfan)回复于 2003-08-04 09:04:04 得分 20

你的代码应该算是不错的了!  
  不过最好能写一个缓冲池!这样用完的连接线不关闭,放到缓冲池中,然后又需要连接的地方  
  先到缓冲池中去找,如果有,就取出,如果没有,在新建连接  
  然后等服务重起的时候在清空缓冲池,这样可以节省时间!节省建立连接的资源  
  另外建议你可以自己写一个连接池,不用tomcat的连接池!Top

2 楼cen8535(小虫)回复于 2003-08-04 09:17:14 得分 10

为什么,不用tomcat的连接池?使用自己写的连接池有什么好处吗?Top

3 楼xinshou1979330(Success.java)回复于 2003-08-04 09:22:47 得分 10

声明:我不是来蹭分的  
  主要是学习  
  Top

4 楼xhongyang(冷月畅晚)回复于 2003-08-04 09:27:19 得分 10

网上有很多比较完善的连接池程序了,自己写意义不大。Top

5 楼Leemaasn(小鸟)回复于 2003-08-04 09:30:52 得分 10

 
   
  分析ing。。。Top

6 楼kongxiangli(笑看红尘)回复于 2003-08-04 09:37:25 得分 10

学习Top

7 楼Frank_Xu()回复于 2003-08-04 12:50:19 得分 0

我上面的連接池代碼,  
  如果用戶惡意不斷刷新,有時導致佔用連接而不能及時歸還.  
   
  能不能在客戶端取得連接後,超過一定時間,自動歸還..Top

8 楼Frank_Xu()回复于 2003-08-09 11:58:28 得分 0

再UP一次,沒人回復就結貼.Top

9 楼lynx1111(任我行:一个PLMM看着就兴奋的男人)回复于 2003-08-09 12:04:21 得分 10

声明:我不是来蹭分的  
  主要是学习Top

10 楼xinshou1979330(Success.java)回复于 2003-08-09 12:26:10 得分 10

声明:我不是来蹭分的  
  主要是学习  
  Top

11 楼yshgfly(我是谁)回复于 2003-08-09 12:43:33 得分 10

声明:我不是来蹭分的  
  主要是学习  
  Top

相关问题

  • Apache + tomcat + jdk2+php + sql server配置办法
  • 新手求助:请提供一个(tomcat+sql server)的数据库连接池的实例
  • sql server连接池问题
  • tomcat连接sql server如何配置环境?
  • 请问tomcat连接sql server是不是这样连?谢谢!
  • tomcat究竟如何配置sql server的驱动啊
  • 求Apache + tomcat + jdk2+php + sql server配置办法
  • 求Apache + tomcat + jdk2+php + sql server配置办法
  • 究竟是用Struts的连接池好还是用tomcat的连接池好?还有struts的SQL Server连接池怎么配置啊?在线给分
  • SQL Server

关键词

  • 连接
  • tomcat
  • jdbc
  • vector
  • ds
  • sql
  • 連接
  • freecons
  • 歸還
  • con

得分解答快速导航

  • 帖主:Frank_Xu
  • luckyfanjian
  • cen8535
  • xinshou1979330
  • xhongyang
  • Leemaasn
  • kongxiangli
  • lynx1111
  • xinshou1979330
  • yshgfly

相关链接

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

广告也精彩

反馈

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