少年阿賓

          那些青春的歲月

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            500 Posts :: 0 Stories :: 135 Comments :: 0 Trackbacks

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

          package com.wangjia.tools;

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

          /**
          * 數(shù)據(jù)庫連接池的簡單實現(xiàn)
          * @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;
          /**
          * 設置數(shù)據(jù)庫連接的驅動
          * @param driver 數(shù)據(jù)庫連接的驅動<br/>例如:"com.microsoft.sqlserver.jdbc.SQLServerDriver"
          */
          public static void setDriver(String driver) {
          DbConn.driver = driver;
          }

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

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

          /**
          * 設置數(shù)據(jù)庫連接的URL
          * @param url 數(shù)據(jù)庫連接的URL,包括數(shù)據(jù)庫的名稱<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("請設置正確的數(shù)據(jù)庫連接驅動!\nusing: DbConn.setDriver(String driver)");

          }catch(SQLException e){
          throw new MyException("請設置正確的數(shù)據(jù)庫連接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();
          }

          }

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

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

          }

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

          posted on 2012-09-03 21:55 abin 閱讀(518) 評論(0)  編輯  收藏 所屬分類: JDBCP
          主站蜘蛛池模板: 东兰县| 贵南县| 邵武市| 昌江| 河东区| 峨眉山市| 海淀区| 永丰县| 贵州省| 延边| 阿尔山市| 平江县| 东莞市| 乐亭县| 山阴县| 灵丘县| 孟村| 古浪县| 始兴县| 廉江市| 吉安市| 博乐市| 邻水| 逊克县| 若羌县| 昌宁县| 山东省| 鄂尔多斯市| 凤凰县| 大城县| 九龙坡区| 晋中市| 兴国县| 洱源县| 彩票| 嘉定区| 休宁县| 界首市| 灵宝市| 江西省| 绥阳县|