国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

自己寫的一個未成熟的數據庫連接池(一)

2019-11-18 12:04:06
字體:
來源:轉載
供稿:網友

  源代碼:
  
  /*
  * @Title 連接池
  * @Author: zxg
  * @Version 1.0
  * @Memo:定義數據庫連接及其數據庫連接池等
  */
  package com.drsl.db;
  
  import java.io.*;
  import java.sql.*;
  import java.util.*;
  import java.util.Date;
  import java.lang.reflect.*;
  import com.MySQL.jdbc.Driver;
  
  import com.drsl.db.*;
  
  public class ConnectionManager {
    
    static PRivate ConnectionManager instance; // 唯一實例
    static private int clients;
    static private int maxonlinetime=30*60*1000;
    
    private Vector drivers = new Vector();
    private Hashtable pools = new Hashtable();
    private Timer checkConnTimer=new Timer();
    
    static private PrintWriter log;
    /**
    * 返回唯一實例.假如是第一次調用此方法,則創建實例
    *
    * @return ConnectionManager 唯一實例
    */
    static synchronized public ConnectionManager getInstance() {
      if (instance == null) {
        instance = new ConnectionManager();
      }
  //    clients++;
      return instance;
    }
    
    /**
    * 建構函數私有以防止其它對象創建本類實例
    */
    private ConnectionManager() {
      init();
    }
    
    /**
    * 讀取屬性完成初始化
    */
    private void init() {
      
      try {
        
        InputStream  is = getClass().getResourceAsStream("db.properties");
        
        Properties  dbProps = new Properties();
      
        dbProps.load(is);
      }
      catch (Exception e) {
        e.printStackTrace();
        System.err.println("不能讀取屬性文件= " +
        "請確保db.properties在CLASSPATH指定的路徑中");
        return;
      }
      String logFile = dbProps.getProperty("logfile", "log.txt");
      try {
        log = new PrintWriter(new FileWriter(logFile, true), true);
      }
      catch (IOException e) {
        System.err.println("無法打開日志文件: " + logFile);
        log = new PrintWriter(System.err);
      }
      loadDrivers(dbProps);
      createPools(dbProps);
    }
    
    /**
    * 裝載和注冊所有JDBC驅動程序
    *
    * @param props 屬性
    */
    private void loadDrivers(Properties props) {
      String driverClasses = props.getProperty("drivers");
      StringTokenizer st = new StringTokenizer(driverClasses);
      while (st.hasMoreElements()) {
        String driverClassName = st.nextToken().trim();
        try {
          
          Driver driver = (Driver)Class.forName(driverClassName).newInstance();
          if(driver!=null){
            DriverManager.registerDriver(driver);
            drivers.addElement(driver);
            log("Begin");
            log("成功注冊JDBC驅動程序" + driverClassName);
          }
          else{
            log("Begin");
            log("注冊JDBC驅動程序" + driverClassName+"失敗");
          }
            
        }
        catch (Exception e) {
          log("Begin");
          log("無法注冊JDBC驅動程序: " + driverClassName + ", 錯誤: " + e);
        }
      }
    }
    
    /**
    * 根據指定屬性創建連接池實例.
    *
    * @param props 連接池屬性
    */
    private void createPools(Properties props) {
      
      Enumeration propNames = props.propertyNames();
      while (propNames.hasMoreElements()) {
        String name = (String) propNames.nextElement();
        if (name.endsWith(".url")) {
          String poolName = name.substring(0, name.lastIndexOf("."));
          String url = props.getProperty(poolName + ".url");
          if (url == null) {
            log("沒有為連接池" + poolName + "指定URL");
            continue;
          }
          
          String user = props.getProperty(poolName + ".user");
          String passWord = props.getProperty(poolName + ".password");
          
          String maxconn = props.getProperty(poolName + ".maxconn", "0");
          String minconn = props.getProperty(poolName + ".minconn", "10");
          String option=props.getProperty(poolName+".option","");
          int max,min;
          try {
            max = Integer.valueOf(maxconn).intValue();
            
          }
          catch (NumberFormatException e) {
            log("錯誤的最大連接數限制: " + maxconn + " .連接池: " + poolName);
            max = 0;
          }
          
          try {
            min = Integer.valueOf(minconn).intValue();
            
          }
          catch (NumberFormatException e) {
            log("錯誤的最小連接數限制: " + minconn + " .連接池: " + poolName);
            min = 0;
          }
          
          try{
            ConnectionPool pool = new ConnectionPool(poolName, url,user,password,min,max,option);
            
            pools.put(poolName, pool);
            
            //2秒鐘后開始每個一分鐘檢查一次連接池情況
            checkConnTimer.schedule(pool,2000,60*1000);
  
            log("成功創建連接池" + poolName);
            
          }catch(Exception e){
            log(e,"創建DBConnectionPool出錯");
          }
        }
      }
    }
  
    /**
    * 將連接對象返回給由名字指定的連接池
    *
    * @param name 在屬性文件中定義的連接池名字
    * @param con 連接對象
    */
    public void freeConnection(String name, Connection conn) {
      ConnectionPool pool = (ConnectionPool) pools.get(name);
      if (pool != null) {
        pool.freeConnection(conn);
      }
    }
    
    /**
    * 獲得一個可用的(空閑的)連接.假如沒有可用連接,且已有連接數小于最大連接數
    * 限制,則創建并返回新連接
    *
    * @param name 在屬性文件中定義的連接池名字
    * @return Connection 可用連接或null
    */
    public Connection getConnection(String name) {
      ConnectionPool pool = (ConnectionPool) pools.get(name);
      if (pool != null) {
        return pool.getConnection();
      }
      return null;
    }
    
    /**
    * 獲得一個可用連接.若沒有可用連接,且已有連接數小于最大連接數限制,
    * 則創建并返回新連接.否則,在指定的時間內等待其它線程釋放連接.
    *
    * @param name 連接池名字
    * @param time 以毫秒計的等待時間
    * @return Connection 可用連接或null
    */
    public Connection getConnection(String name, long time) {
      ConnectionPool pool = (Con

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 三门县| 崇左市| 三门峡市| 息烽县| 屯门区| 翼城县| 三原县| 莱芜市| 商洛市| 武清区| 如皋市| 北票市| 宜春市| 什邡市| 德安县| 大庆市| 礼泉县| 呼玛县| 富顺县| 锦州市| 泽普县| 拜泉县| 古田县| 紫金县| 丹凤县| 滦平县| 扎兰屯市| 扶余县| 子长县| 贺兰县| 民勤县| 景泰县| 瓮安县| 长泰县| 文水县| 新乡市| 邢台县| 双城市| 清远市| 淮南市| 清远市|