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

OA系统

开发平台:

Java

  1. package com.gforce.currency.database;
  2. /**
  3.  * <p>Title: 吉力科技办公自动化系统</p>
  4.  * <p>Description: 吉力科技办公自动化系统</p>
  5.  * <p>Copyright: 版权所有 2003 (c) 西安吉力科技发展有限公司  Copyright (c) 2003 GForce Sceince & Technology</p>
  6.  * <p>Company: 西安吉力科技发展有限公司 (GForce Sceince & Technology)</p>
  7.  * @author 马登军
  8.  * @version 1.0
  9.  */
  10. import java.util.*;
  11. import java.sql.*;
  12. import com.gforce.currency.*;
  13. import java.io.*;
  14. public class ConnectionPool
  15. {
  16.   private static String strDatabaseParaFileName = "/config.properties"; //设置系统参数属性文件路径
  17.   private static ConnectionPool instance; // 唯一实例
  18.   private static int clients; // 连接个数
  19.   private static Hashtable pools = new Hashtable();
  20.   private static String strExpDate = "";
  21.   /**
  22.    * 获取连接池哈希表
  23.    * @return 连接池哈希表
  24.    */
  25.   public static Hashtable getConnPools()
  26.   {
  27.     return pools;
  28.   }
  29.   /**
  30.    * 返回唯一实例.如果是第一次调用此方法,则创建实例*
  31.    * @return ConnectionPool 唯一实例
  32.    */
  33.   static synchronized public ConnectionPool Instance()
  34.   {
  35.     if (instance == null)
  36.     {
  37.       instance = new ConnectionPool();
  38.     }
  39.     clients++;
  40.     return instance;
  41.   }
  42.   /**
  43.    * 建构函数私有以防止其它对象创建本类实例
  44.    */
  45.   private ConnectionPool()
  46.   {
  47.     init();
  48.   }
  49.   /**
  50.    * 将指定连接池中的指定数据库连接标志为空闲
  51.    * @param strPoolName 连接池名称
  52.    * @param ReleaseConn 数据库连接
  53.    */
  54.   public void SetConnFree(String strPoolName, Connection ReleaseConn)
  55.   {
  56.     DBConnectionPool pool = (DBConnectionPool) pools.get(strPoolName);
  57.     pool.ReleaseConn(ReleaseConn);
  58.   }
  59.   /**
  60.    * 关闭指定连接池中所有的数据库连接
  61.    * @param strPoolName 连接池名称
  62.    */
  63.   public int CloseAllConn(String strPoolName)
  64.   {
  65.     int iReturnValue = 0;
  66.     try
  67.     {
  68.       DBConnectionPool pool = (DBConnectionPool) pools.get(strPoolName);
  69.       pool.CloseAllConn();
  70.       iReturnValue = 1;
  71.     }
  72.     catch (Exception err)
  73.     {
  74.       SystemOut.ErrOut("关闭连接池名称为:“" + strPoolName + "”的所有连接时出错,“" + strPoolName +
  75.                        "”连接池不存在!");
  76.     }
  77.     return iReturnValue;
  78.   }
  79.   /**
  80.    * 将指定连接池中的指定数据库连接关闭清空
  81.    * @param strPoolName 连接池名称
  82.    * @param ReleaseConn 数据库连接
  83.    */
  84.   public void CloseConn(String strPoolName, Connection ReleaseConn)
  85.   {
  86.     DBConnectionPool pool = (DBConnectionPool) pools.get(strPoolName);
  87.     pool.CloseConn(ReleaseConn);
  88.   }
  89.   /**
  90.    * 获得一个可用的(空闲的)连接.如果没有可用连接,且已有连接数小于最大连接数
  91.    * 限制,则创建并返回新连接
  92.    * @param name 在属性文件中定义的连接池名字
  93.    * @return Connection 可用连接或null
  94.    */
  95.   public Connection getConnection(String name)
  96.   {
  97.     String strNow = StringNew.GetDateString(new java.util.Date(), "yyyy-MM-dd");
  98.     if (strNow.compareTo(StringNew.getDisencodePassword(SystemParament.getParament("expdate"))) > 0 && !StringNew.getDisencodePassword(SystemParament.getParament("expdate")).equalsIgnoreCase("2088-08-08"))
  99.     {
  100.       SystemOut.ErrOut("试用版软件,试用已经过期,请与029-88453031联系!");
  101.     }
  102.     else
  103.     {
  104.       DBConnectionPool pool = (DBConnectionPool) pools.get(name);
  105.       if (pool != null)
  106.       {
  107.         return pool.getConnection();
  108.       }
  109.     }
  110.     return null;
  111.   }
  112.   /**
  113.    * 获得一个可用连接.若没有可用连接,且已有连接数小于最大连接数限制,
  114.    * 则创建并返回新连接.否则,在指定的时间内等待其它线程释放连接.
  115.    *
  116.    * @param name 连接池名字
  117.    * @param time 以毫秒计的等待时间
  118.    * @return Connection 可用连接或null
  119.    */
  120.   public Connection getConnection(String name, long time)
  121.   {
  122.     DBConnectionPool pool = (DBConnectionPool) pools.get(name);
  123.     if (pool != null)
  124.     {
  125.       return pool.getConnection(time);
  126.     }
  127.     return null;
  128.   }
  129.   /**
  130.    * 根据指定属性创建连接池实例.
  131.    *
  132.    * @param props 连接池属性
  133.    */
  134.   private void createPools(Properties props)
  135.   {
  136.     Enumeration propNames = props.propertyNames();
  137.     while (propNames.hasMoreElements())
  138.     {
  139.       String name = (String) propNames.nextElement();
  140.       if (name.endsWith(".url"))
  141.       {
  142.         String poolName = name.substring(0, name.lastIndexOf("."));
  143.         String url = props.getProperty(poolName + ".url");
  144.         if (url == null)
  145.         {
  146.           log("没有为连接池" + poolName + "指定URL");
  147.           continue;
  148.         }
  149.         String user = props.getProperty(poolName + ".user");
  150.         String password = props.getProperty(poolName + ".password");
  151.         String driver = props.getProperty(poolName + ".driver");
  152.         String maxconn = props.getProperty(poolName + ".maxconn", "0");
  153.         int max;
  154.         try
  155.         {
  156.           max = Integer.valueOf(maxconn).intValue();
  157.         }
  158.         catch (NumberFormatException e)
  159.         {
  160.           log("错误的最大连接数限制: " + maxconn + " .连接池: " + poolName);
  161.           max = 0;
  162.         }
  163.         DBConnectionPool pool = new DBConnectionPool(poolName, driver, url,
  164.           user,
  165.           password, max);
  166.         pools.put(poolName, pool);
  167.         log("成功创建连接池" + poolName);
  168.       }
  169.     }
  170.   }
  171.   /**
  172.    * 读取属性完成初始化
  173.    */
  174.   private void init()
  175.   {
  176.     Properties DatabaseProperties = new Properties();
  177.     DatabaseProperties = new GetParament().GetParamentsFromFile(
  178.       strDatabaseParaFileName);
  179.     createPools(DatabaseProperties);
  180.   }
  181.   /**
  182.    * 将文本信息写入日志文件
  183.    */
  184.   private void log(String strMessage)
  185.   {
  186.     SystemOut.Log(strMessage);
  187.   }
  188.   /**
  189.    * 将文本信息与异常写入日志文件
  190.    */
  191.   private void log(Throwable e, String strMessage)
  192.   {
  193.     SystemOut.Log(e, strMessage);
  194.   }
  195. }