首先说明一下:这个例子是来源于【C#线程参考手册】参考手册内的一个例子,在这个我只是想研究一下她的设计原理。
具体好用不好用,因为没有做具体项目的测试,所以提醒大家注意。
1 设计思路:
1.1 在程序的全局利用单例模式建立一个数据库连接池对象。
1.2 获得数据库连接方法BorrowDBConnection()。
这个方法的作用如下:
如果【待清理的池】内DB连接对象不是关闭状态,则添加到【DB连接池】,继续使用。
如果【待清理的池】内DB连接对象是关闭状态,则DB连接被移除【待清理的池】,之后被关闭。
如果【待清理的池】不存在DB连接对象,则创建DB连接对象后,附加到【DB连接池】内,然后使用她。
1.3 返回数据库连接给【待清理的池】,方法是ReturnObjectToPool()。
【DB连接池】删除DB连接对象。
【待清理的池】追加DB连接对象。
1.4 延迟DB连接对象的垃圾回收事件
通过Timer的Elapsed事件,来实现【待清理的池】内的DB连接对象的关闭处理。
2 UML图例:

这里要说明的是,为什么要继承ObjectPool类呢?
因为ObjectPool类的结构对于所有使用池、可手动释放资源的对象是通用的。
3 具体代码如下:
3.1 ObjectPool类(真的很通用的一个类,设计的很好,感觉可以继承她做任何事)
3.2 DBConnectionSingleton类 - 数据库连接池(实现了ObjectPool类的Create,Validate,Expire方法,并使用了单例模式)
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Data.SqlClient;
-
- namespace SqlPool
- {
- class DBConnectionSingleton:ObjectPool
- {
- private DBConnectionSingleton() { }
-
-
-
-
- public static readonly DBConnectionSingleton Instance = new DBConnectionSingleton();
-
- private static string _connectionString = @"Data Source=192.168.168.251/Sql2005;Initial Catalog=XX;User ID=sa;Password=777";
-
-
-
-
- public static string ConnectionString
- {
- set {
- _connectionString = value;
- }
- get
- {
- return _connectionString;
- }
- }
-
-
-
-
-
- protected override object Create()
- {
- SqlConnection temp = new SqlConnection(_connectionString);
- temp.Open();
- return temp;
- }
-
-
-
-
-
-
- protected override bool Validate(object o)
- {
- try
- {
- SqlConnection temp = (SqlConnection)o;
- return (!((temp.State.Equals(System.Data.ConnectionState.Closed))));
- }
- catch
- {
- return false;
- }
- }
-
-
-
-
-
- protected override void Expire(object o)
- {
- try
- {
- ((SqlConnection)o).Close();
- }
- catch {
- }
- }
-
-
-
-
-
- public SqlConnection BorrowDBConnection()
- {
- try
- {
- return ((SqlConnection)base.GetObjectFromPool());
- }
- catch(Exception e) {
- throw e;
- }
- }
-
-
-
-
-
- public void ReturnDBConnecion(SqlConnection e)
- {
- base.ReturnObjectToPool(e);
- }
- }
- }
3.3 Main函数
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Data.SqlClient;
-
- namespace SqlPool
- {
- class Program
- {
- static void Main(string[] args)
- {
- DBConnectionSingleton pool;
-
-
- pool = DBConnectionSingleton.Instance;
-
- DBConnectionSingleton.ConnectionString = @"Data Source=192.168.168.251/Sql2005;Initial Catalog=XX;User ID=sa;Password=777";
-
- SqlConnection myConnection = pool.BorrowDBConnection();
- pool.ReturnDBConnecion(myConnection);
- System.Threading.Thread.Sleep(5000);
- }
- }
- }