熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

Oracle數據庫 關於連接池一

2022-06-13   來源: Oracle 

  到目前為目JDBC的連結池只是一個接口沒有真正的實現JDBC正在開發中據報已經支持連結池但JDBC用了JNDI技術連結池的配置可以讓一個高手都煩死
  
  目前第三方已經實現的連結池當然是poolman版對一般用戶來說已經足夠用了配置也簡單版雖然增加了一些功能但配置也是采用JNDI對RMI和EJB不懂的朋友可能很煩建議用的了
  
  如果有興趣自己也可以實現連結池最關鍵的技術也就是把連結作為參數傳給一個BEAN用完後返回這個參數連結而不是關閉
  
  下面是一個簡單的實現:
  
  DBConnectionManagerjava程序清單如下
  
   import javaio*;
   import javasql*;
   import javautil*;
   import javautilDate;
  
   /**
   * 管理類DBConnectionManager支持對一個或多個由屬性文件定義的數據庫連接
   * 池的訪問客戶程序可以調用getInstance()方法訪問本類的唯一實例
   */
   public class DBConnectionManager {
   static private DBConnectionManager instance; // 唯一實例
   static private int clients;
  
   private Vector drivers = new Vector();
   private PrintWriter log;
   private Hashtable pools = new Hashtable();
  
   /**
   * 返回唯一實例如果是第一次調用此方法則創建實例
   *
   * @return DBConnectionManager 唯一實例
   */
   static synchronized public DBConnectionManager getInstance() {
   if (instance == null) {
   instance = new DBConnectionManager();
   }
   clients++;
   return instance;
   }
  
   /**
   * 建構函數私有以防止其它對象創建本類實例
   */
   private DBConnectionManager() {
   init();
   }
  
   /**
   * 將連接對象返回給由名字指定的連接池
   *
   * @param name 在屬性文件中定義的連接池名字
   * @param con 連接對象\\r
  
   */
   public void freeConnection(String name Connection con) {
   DBConnectionPool pool = (DBConnectionPool) poolsget(name);
   if (pool != null) {
   poolfreeConnection(con);
   }
   }
  
   /**
   * 獲得一個可用的(空閒的)連接如果沒有可用連接且已有連接數小於最大連接數
   * 限制則創建並返回新連接
   *
   * @param name 在屬性文件中定義的連接池名字
   * @return Connection 可用連接或null
   */
   public Connection getConnection(String name) {
   DBConnectionPool pool = (DBConnectionPool) poolsget(name);
   if (pool != null) {
   return poolgetConnection();
   }
   return null;
   }
  
   /**
   * 獲得一個可用連接若沒有可用連接且已有連接數小於最大連接數限制
   * 則創建並返回新連接否則在指定的時間內等待其它線程釋放連接
   *
   * @param name 連接池名字
   * @param time 以毫秒計的等待時間\\r
  
   * @return Connection 可用連接或null
   */
   public Connection getConnection(String name long time) {
   DBConnectionPool pool = (DBConnectionPool) poolsget(name);
   if (pool != null) {
   return poolgetConnection(time);
   }
   return null;
   }
  
   /**
   * 關閉所有連接撤銷驅動程序的注冊\\r
  
   */
   public synchronized void release() {
   // 等待直到最後一個客戶程序調用
   if (clients != ) {
   return;
   }
  
   Enumeration allPools = poolselements();
   while (allPoolshasMoreElements()) {
   DBConnectionPool pool = (DBConnectionPool) allPoolsnextElement();
   poolrelease();
   }
   Enumeration allDrivers = driverselements();
   while (allDrivershasMoreElements()) {
   Driver driver = (Driver) allDriversnextElement();
   try {
   DriverManagerderegisterDriver(driver);
   log(撤銷JDBC驅動程序 + drivergetClass()getName()+的注冊\\\);
   }
   catch (SQLException e) {
   log(e 無法撤銷下列JDBC驅動程序的注冊: + drivergetClass()getName());
   }
   }
   }
  
   /**
   * 根據指定屬性創建連接池實例
   *
   * @param props 連接池屬性
   */
   private void createPools(Properties props) {
   Enumeration propNames = propspropertyNames();
   while (propNameshasMoreElements()) {
   String name = (String) propNamesnextElement();
   if (nameendsWith(url)) {
   String poolName = namesubstring( namelastIndexOf());
   String url = propsgetProperty(poolName + url);
   if (url == null) {
   log(沒有為連接池 + poolName + 指定URL);
   continue;
   }
   String user = propsgetProperty(poolName + user);
   String password = propsgetProperty(poolName + password);
   String maxconn = propsgetProperty(poolName + maxconn );
   int max;
   try {
   max = IntegervalueOf(maxconn)intValue();
   }
   catch (NumberFormatException e) {
   log(錯誤的最大連接數限制: + maxconn + 連接池: + poolName);
   max = ;
   }
   DBConnectionPool pool =
   new DBConnectionPool(poolName url user password max);
   poolsput(poolName pool);
   log(成功創建連接池 + poolName);
   }
   }
   }
  
   /**
   * 讀取屬性完成初始化
   */
   private void init() {
   InputStream is = getClass()getResourceAsStream(/dbproperties);
   Properties dbProps = new Properties();
   try {
   dbPropsload(is);
   }
   catch (Exception e) {
   Systemerrprintln(不能讀取屬性文件 +
   請確保dbproperties在CLASSPATH指定的路徑中);
   return;
   }
   String logFile = dbPropsgetProperty(logfile DBConnectionManagerlog);
   try {
   log = new PrintWriter(new FileWriter(logFile true) true);
   }
   catch (IOException e) {
   Systemerrprintln(無法打開日志文件: + logFile);
   log = new PrintWriter(Systemerr);
   }
   loadDrivers(dbProps);
   createPools(dbProps);
   }
  
   /**
   * 裝載和注冊所有JDBC驅動程序\\r
  
   *
   * @param props 屬性
   */
   private void loadDrivers(Properties props) {
   String driverClasses = propsgetProperty(drivers);
   StringTokenizer st = new StringTokenizer(driverClasses);
   while (sthasMoreElements()) {
   String driverClassName = stnextToken()trim();
   try {
   Driver driver = (Driver)
   ClassforName(driverClassName)newInstance();
   DriverManagerregisterDriver(driver);
   driversaddElement(driver);
   log(成功注冊JDBC驅動程序\\\ + driverClassName);
   }
   catch (Exception e) {
   log(無法注冊JDBC驅動程序: +
   driverClassName + 錯誤: + e);
   }
   }
   }
  
   /**
   * 將文本信息寫入日志文件
   */
   private void log(String msg) {
   logprintln(new Date() + : + msg);
   }
  
   /**
   * 將文本信息與異常寫入日志文件
   */
   private void log(Throwable e String msg) {
   logprintln(new Date() + : + msg);
   eprintStackTrace(log);
   }
  
   /**
   * 此內部類定義了一個連接池它能夠根據要求創建新連接直到預定的最\\r
From:http://tw.wingwit.com/Article/program/Oracle/201311/17331.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.