少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

          下面是以前學java 的時候寫的一個實現,沒有考慮很多,比如同步處理等等。懶得改,你就看看吧。

          package com.wangjia.tools;

          import java.io.Serializable;
          import java.sql.*;
          import java.util.*;

          /**
          * 數據庫連接池的簡單實現
          * @author wangjia
          * @version 1.0
          *@serial 2301410997974776106L
          */
          public class DbConn implements Serializable{

          /**
          * 
          */
          private static final long serialVersionUID = 2301410997974776106L;
          private static List<Connection> connList=new ArrayList<Connection>();
          //private static String driver="com.microsoft.jdbc.sqlserver.SQLServerDriver";//sql2000
          private static String driver="com.microsoft.sqlserver.jdbc.SQLServerDriver";//sql2005
          private static String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=Forum";
          private static String userName="sa";
          private static String password="sa";
          private static int maxConn=20;
          private static int minConn=5;
          private static int usedConn=0;
          private static DbConn dbconn=null;
          // private static int flag=1;
          /**
          * 設置數據庫連接的驅動
          * @param driver 數據庫連接的驅動<br/>例如:"com.microsoft.sqlserver.jdbc.SQLServerDriver"
          */
          public static void setDriver(String driver) {
          DbConn.driver = driver;
          }

          /**
          * 設置數據庫連接池的最小數
          * @param maxConn 數據庫連接池的最小數量
          */
          public static void setMaxConn(int maxConn) {
          DbConn.maxConn = maxConn;
          }

          /**
          * 設置數據庫連接池的最大數
          * @param minConn 數據庫連接池的最大數量
          */
          public static void setMinConn(int minConn) {
          DbConn.minConn = minConn;
          }

          /**
          * 設置數據庫連接的URL
          * @param url 數據庫連接的URL,包括數據庫的名稱<br/>例如: "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=master"
          */
          public static void setUrl(String url) {
          DbConn.url = url;
          }

          private DbConn() throws MyException{
          try{
          Class.forName(driver);
          for(int i=0;i<minConn;i++){
          connList.add(DriverManager.getConnection(url,userName.toString(),password.toString()));
          }
          }catch(ClassNotFoundException e){
          throw new MyException("請設置正確的數據庫連接驅動!\nusing: DbConn.setDriver(String driver)");

          }catch(SQLException e){
          throw new MyException("請設置正確的數據庫連接URL以及用于連接的用戶名和密碼!\n" +
          "using: DbConn.setUrl(String url),DbConn.setUserName(String userName),DbConn.setPassword(String password)");

          }
          }
          /**
          * 用于得到DbConn對象
          * @return 返回一個DbConn對像
          */

          public static Connection getConn() throws MyException{
          // flag++;
          if(dbconn==null)dbconn=new DbConn();
          // System.out.println("falg="+flag);
          // System.out.println("usedConn="+usedConn);
          if(connList.size()==0){
          throw new MyException("沒有正確的設置相關信息,以至連接池未初始化");
          }
          if(usedConn==maxConn){

          Thread thread=new Thread(new Runnable(){

          @SuppressWarnings("static-access")
          public void run() {
          if(usedConn<maxConn){
          try {
          try {
          Thread.currentThread().sleep(2000);
          } catch (InterruptedException e) {
          e.printStackTrace();
          }
          getConn();
          } catch (MyException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
          }
          }

          }

          });
          thread.start();
          }
          if(usedConn>=minConn&&usedConn<maxConn){
          try {
          connList.add(DriverManager.getConnection(url,userName.toString(),password.toString()));
          } catch (SQLException e) {

          }
          return connList.get(usedConn++);
          }
          if(usedConn<5){
          return connList.get(usedConn++);
          }
          return null;
          }

          public static void close(){
          try {
          if(usedConn>5)
          connList.get(--usedConn).close();
          else usedConn--;
          } catch (SQLException e) {
          // TODO 自動生成 catch 塊
          e.printStackTrace();
          }

          }

          /**
          * 設置用于連接數據庫的密碼
          * @param password 用于連接數據庫的密碼
          */
          public static void setPassword(String password) {
          DbConn.password = password;
          }

          /**
          * 設置用于連接數據庫的用戶名
          * @param userName 用于連接數據庫的用戶名
          */
          public static void setUserName(String userName) {
          DbConn.userName = userName;
          }

          }

          在項目中用到連接池的話,一般會直接使用已有的開源連接池實現,比如用 apache 的common-dbcp.jar和common-pool.jar 相結合,很少去自己實現。

          posted on 2012-09-03 21:55 abin 閱讀(513) 評論(0)  編輯  收藏 所屬分類: JDBCP
          主站蜘蛛池模板: 临汾市| 明光市| 永春县| 广安市| 保康县| 新余市| 镇巴县| 如东县| 辽阳市| 中江县| 临清市| 贵阳市| 佛教| 迁安市| 大城县| 固阳县| 崇明县| 牡丹江市| 莱西市| 塔河县| 克什克腾旗| 新晃| 白水县| 汉寿县| 建瓯市| 天镇县| 德令哈市| 施秉县| 福州市| 广灵县| 韶关市| 宿松县| 太白县| 桦甸市| 始兴县| 松潘县| 玛纳斯县| 鄂伦春自治旗| 邛崃市| 晋宁县| 察雅县|