DBConnectionPool.java
上传用户:mingda
上传日期:2017-06-20
资源大小:27691k
文件大小:6k
源码类别:

OA系统

开发平台:

Java

  1. package com.gforce.currency.database;
  2. /**
  3.  * <p>Title: GForce Office Automation </p>
  4.  * <p>Description: </p>
  5.  * <p>Copyright: 版权所有 2003 (c) 西安吉力科技发展有限公司  Copyright (c) 2003 GForce Sceince & Technology Co.,LTD</p>
  6.  * <p>Company: 西安吉力科技发展有限公司 (2003 GForce Sceince & Technology Co.,LTD)</p>
  7.  * @author JBuilder Group
  8.  * @version 2.0
  9.  */
  10. import java.util.*;
  11. import java.sql.*;
  12. import com.gforce.currency.*;
  13. import java.util.Date;
  14. import java.io.*;
  15. public class DBConnectionPool
  16. {
  17.   public Vector FreeConn = new Vector();
  18.   public Vector BusyConn = new Vector();
  19.   public int ConnCount = 0;
  20.   public int intMaxConn;
  21.   public String Name;
  22.   private String Driver;
  23.   private String URL;
  24.   private String User;
  25.   private String Password;
  26.   /**
  27.    * DBConnectionPool构造函数
  28.    * @param Name    连接池名称
  29.    * @param Driver  驱动程序类名称
  30.    * @param URL     连接JDBC URL
  31.    * @param User    用户名
  32.    * @param Password    密码
  33.    * @param intMaxConn  最大连接数
  34.    */
  35.   public DBConnectionPool(String Name, String Driver, String URL, String User,
  36.                           String Password, int intMaxConn)
  37.   {
  38.     this.Name = Name;
  39.     this.Driver = Driver;
  40.     this.URL = URL;
  41.     this.User = User;
  42.     this.Password = Password;
  43.     this.intMaxConn = intMaxConn;
  44.   }
  45.   /**
  46.    * 将数据库连接标志为空闲
  47.    * @param ReleaseConn 数据库连接
  48.    */
  49.   public void ReleaseConn(Connection ReleaseConn)
  50.   {
  51.     FreeConn.addElement(ReleaseConn);
  52.     for(int i=0;i<BusyConn.size();i++)
  53.     {
  54.       if(((Vector)BusyConn.get(i)).get(0).equals(ReleaseConn))
  55.       {
  56.         BusyConn.remove(i);
  57.       }
  58.     }
  59.   }
  60.   /**
  61.    * 关闭指定的数据库连接
  62.    * @param Conn 数据库连接
  63.    */
  64.   public void CloseConn(Connection Conn)
  65.   {
  66.     try
  67.     {
  68.       ConnCount--;
  69.       for (int i = 0; i < BusyConn.size(); i++) {
  70.         if ( ( (Vector) BusyConn.get(i)).get(0).equals(Conn)) {
  71.           BusyConn.remove(i);
  72.         }
  73.       }
  74.       Conn.close();
  75.       Conn=null;
  76.     }
  77.     catch(Exception err)
  78.     {
  79.       SystemOut.ErrOut("单个释放连接池名称为:“" + Name + "”的连接时出错!");
  80.     }
  81.   }
  82.   /**
  83.    * 关闭所有的数据库连接
  84.    */
  85.   public void CloseAllConn()
  86.   {
  87.     try
  88.     {
  89.       Connection con = null;
  90.       for (int i = 0; i < FreeConn.size(); i++) {
  91.         try {
  92.           con = (Connection) FreeConn.get(i);
  93.           con.close();
  94.           ConnCount--;
  95.           con = null;
  96.           FreeConn.remove(i);
  97.         }
  98.         catch (Exception err) {
  99.           SystemOut.ErrOut("批量释放连接池名称为:“" + Name + "”的空闲连接时出错!");
  100.         }
  101.       }
  102.       for (int i = 0; i < BusyConn.size(); i++) {
  103.         try {
  104.           con = (Connection) ( (Vector) BusyConn.get(i)).get(0);
  105.           con.close();
  106.           ConnCount--;
  107.           con = null;
  108.           BusyConn.remove(i);
  109.         }
  110.         catch (Exception err) {
  111.           SystemOut.ErrOut("批量释放连接池名称为:“" + Name + "”的繁忙连接时出错!");
  112.         }
  113.       }
  114.       if(ConnCount>0 || BusyConn.size()>0 || FreeConn.size()>0)
  115.       {
  116.         CloseAllConn();
  117.       }
  118.     }
  119.     catch(Exception err)
  120.     {
  121.       SystemOut.ErrOut("关闭连接池名称为:“" + Name + "”的所有连接时出错!");
  122.     }
  123.   }
  124.   /**
  125.    * 从连接池获得一个可用连接.如没有空闲的连接且当前连接数小于最大连接
  126.    * 数限制,则创建新连接.如原来登记为可用的连接不再有效
  127.    */
  128.   public synchronized Connection getConnection()
  129.   {
  130.     Connection con = null;
  131.     try
  132.     {
  133.       for (int i = 0; i < BusyConn.size(); i++) {
  134.         int ibe = (new Date()).compareTo(((Vector) BusyConn.get(i)).get(1));
  135.         if (ibe>1000) {
  136.           con = (Connection)((Vector)BusyConn.get(i)).get(0);
  137.           con.close();
  138.           con = null;
  139.           BusyConn.remove(i);
  140.           ConnCount--;
  141.         }
  142.       }
  143.       for (int i = 0; i < FreeConn.size(); i++)
  144.       {
  145.         con = (Connection)FreeConn.get(i);
  146.         if ( con.isClosed())
  147.         {
  148.           con = null;
  149.           FreeConn.remove(i);
  150.           ConnCount--;
  151.           return getConnection();
  152.         }
  153.       }
  154.       if (FreeConn.size() > 0)
  155.       {
  156.         con = (Connection) FreeConn.get(0);
  157.         FreeConn.remove(0);
  158.         Vector vt = new Vector();
  159.         vt.add(con);
  160.         vt.add(new Date());
  161.         BusyConn.add(vt);
  162.         return con;
  163.       }
  164.       if (ConnCount < intMaxConn || intMaxConn == 0)
  165.       {
  166.         con = ConnectionSingle.getConnectionSingle(Driver, URL, User, Password);
  167.         ConnCount++;
  168.         Vector vt = new Vector();
  169.         vt.add(con);
  170.         vt.add(new Date());
  171.         BusyConn.add(vt);
  172.         return con;
  173.       }
  174.       else
  175.       {
  176.         con = getConnection(10);
  177.         return con;
  178.       }
  179.     }
  180.     catch (Exception err)
  181.     {
  182.       SystemOut.ErrOut("创建连接池名称为“" + Name + "”的连接时出错!");
  183.     }
  184.     return con;
  185.   }
  186.   /**
  187.    * 从连接池获取可用连接.可以指定客户程序能够等待的最长时间
  188.    * 参见前一个getConnection()方法.
  189.    * @param timeout 以毫秒计的等待时间限制
  190.    */
  191.   public synchronized Connection getConnection(long timeout)
  192.   {
  193.     long startTime = new Date().getTime();
  194.     Connection con;
  195.     while ( (con = getConnection()) == null)
  196.     {
  197.       if ( (new Date().getTime() - startTime) >= timeout)
  198.       {
  199.         return null;
  200.       }
  201.     }
  202.     return con;
  203.   }
  204.   /**
  205.    * 关闭所有连接
  206.    */
  207.   public synchronized void release()
  208.   {
  209.     Connection con = null;
  210.     for (int i = 0; i < FreeConn.size(); i++)
  211.     {
  212.       try
  213.       {
  214.         con = (Connection) FreeConn.get(i);
  215.         con.close();
  216.         ConnCount--;
  217.         con = null;
  218.         FreeConn.remove(i);
  219.       }
  220.       catch (Exception err)
  221.       {
  222.         SystemOut.ErrOut("批量释放连接池名称为:“" + Name + "”的连接时出错!");
  223.       }
  224.     }
  225.     for (int i = 0; i < BusyConn.size(); i++)
  226.     {
  227.       try
  228.       {
  229.         con = (Connection)((Vector)BusyConn.get(i)).get(0);
  230.         con.close();
  231.         ConnCount--;
  232.         con = null;
  233.         BusyConn.remove(i);
  234.       }
  235.       catch (Exception err)
  236.       {
  237.         SystemOut.ErrOut("批量释放连接池名称为:“" + Name + "”的连接时出错!");
  238.       }
  239.     }
  240.   }
  241. }