??????? 本文是用.net實現的數據庫鏈接池,大體體現了數據庫鏈接池的實現思想,ADO.NET已經提供了很好的鏈接池維護,所以本程序基本沒有什么實用價值:
1.鏈接池管理類
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Collections;
using System.Configuration;
/// <summary>
/// DbConnectionPool 的摘要說明
/// </summary>
namespace dbopr
{
??? public class DbConnectionPool
??? {
??????? //定義存放數據庫鏈接的隊列
??????? private static Queue connections=new Queue();
??????? //數據庫參數
??????? private static string ConnString = "";??????????????????????????????????? //鏈接字符串
??????? //鏈接池參數
??????? private static int InitSize = 20;???????????????????????????????????????? //初始化鏈接池大小
??????? private static int MaxSize = 100;???????????????????????????????????????? //最大鏈接數
??????? private static int QueueSize = 50;??????????????????????????????????????? //隊列中最大維護的鏈接數
??????? private static int ConnNum = 0;?????????????????????????????????????????? //系統維護的鏈接總數
??????? //定義數據庫類型,1表示為SqlServer數據庫,2表示其它的OLE DB;默認為SqlServer
??????? private static int? DbType = 1;
??????? public static int DbType
??????? {
??????????? set
??????????? {
??????????????? DbType = value;
??????????? }
??????? }
??????? private DbConnectionPool()
??????? {
??????????? try{
??????????????? ConnString = Configuration.connectionStrings["DbSource"].connectionString;
??????????????? InitSize = int.Parse(Configuration.connectionStrings["InitSize"].connectionString);
??????????????? MaxSize = int.Parse(Configuration.connectionStrings["MaxSize"].connectionString);
??????????????? QueueSize = int.Parse(Configuration.connectionStrings["QueueSize"].connectionString);
??????????????? DbType = int.Parse(Configuration.connectionStrings["DbType"].connectionString);
??????????????? initPool();
??????????? }
??????????? catch(Exception e) {
??????????? }
??????? }
???????
??????? //初始化鏈接池
??????? private static void initPool(){
??????????? int i;
??????????? for (i = 1; i <= InitSize; i++) {
??????????????? if (DbType == 1)
??????????????????? connections.Enqueue(newSqlConn());
??????????????? else
??????????????????? connections.Enqueue(newOleConn());
??????????? }
??????? }
??????? //獲取一個Sql Server鏈接對象
??????? private static SqlConnection newSqlConn()
??????? {
??????????? ConnNum++;
??????????? return new SqlConnection(ConnString);
??????? }
???????
??????? //獲取一個OLE DB鏈接對像
??????? private static OleDbConnection newOleConn()
??????? {
??????????? ConnNum++;
??????????? return new OleDbConnection(ConnString);
??????? }
??????? //獲取一個數據庫鏈接
??????? public static IDbConnection getConn() {
??????????? if (connections.Count == 0)????????????????????????????????? //如果隊列中鏈接用完,則新建一個鏈接放入隊列
??????????? {
??????????????? if (ConnNum > MaxSize)?????????????????????????????????? //如果當前活動鏈接達到最大,則等待鏈接
??????????????????? return null;
??????????????? else
??????????????? {
??????????????????? if (DbType == 1)
??????????????????????? connections.Enqueue(newSqlConn());
??????????????????? else
??????????????????????? connections.Enqueue(newOleConn());
??????????????????? return connections.Dequeue();
??????????????? }
??????????? }
??????????? else
??????????????? return connections.Dequeue();
??????? }
??????? //釋放一個活運鏈接
??????? public static void reConn(IDbConnection conn) {
??????????? if (connections.Count > QueueSize)?????????????????????????? //如果隊列中元素個數已達到最大,則關閉鏈接
??????????????? conn.Close();
??????????? else
??????????????? connections.Enqueue(conn);
??????? }
??????? //銷毀鏈接池
??????? public static void ClearPool() {
??????????? while(connections.Count>0)
???????????????? (IDbConnection)connections.Dequeue().Close();
??????? }
??? }
}
2.鏈接生成類
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Configuration;
using System.Web;
/// <summary>
/// DbConn 的摘要說明
/// </summary>
namespace dbopr
{
??? public class DbConnection
??? {
??????? private static IDbConnection conn;
???????
??????? public DbConnection()
??????? {
??????????? //
??????????? // TODO: 在此處添加構造函數邏輯
??????????? //
??????? }
??????? public static SqlConnection getSqlConn()
??????? {
??????????? //獲取鏈接池中的Sql Server的鏈接
??????????? conn = DbConnectionPool.getConn();
??????????? return (SqlConnection)conn;
??????? }
??????? public static OleDbConnection getOleConn() {
??????????? //獲取其它OLE DB的鏈接
??????????? conn = DbConnectionPool.getConn();
??????????? return (OleDbConnection)conn;
??????? }
??????? public static void Close() {
??????????? //放回用過的鏈接
??????????? DbConnectionPool.reConn(conn);
??????? }
??? }
}