1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 4 多线程应用:数据库连接池

4 多线程应用:数据库连接池

时间:2020-08-26 13:46:41

相关推荐

4 多线程应用:数据库连接池

4 多线程应用:数据库连接池

分类:读书笔记-11-09 15:46747人阅读评论(0)收藏举报 数据库连接池多线程object数据库exceptionstring

首先说明一下:这个例子是来源于【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连接对象的关闭处理。

2UML图例:

这里要说明的是,为什么要继承ObjectPool类呢?

因为ObjectPool类的结构对于所有使用池、可手动释放资源的对象是通用的。

3 具体代码如下:

3.1 ObjectPool类(真的很通用的一个类,设计的很好,感觉可以继承她做任何事)

[c-sharp]view plaincopyusingSystem; usingSystem.Collections; usingSystem.Timers; usingSystem.Text; namespaceSqlPool { publicabstractclassObjectPool { ///<summary> /////当前日期时间刻度值,用户判断连接是否超时 ///</summary> privatelong_lastCheckOut; ///<summary> ///使用对象池 ///</summary> privatestaticHashtablelocked; ///<summary> ///清理对象池 ///</summary> privatestaticHashtableunlocked; internalstaticlongGARBAGE_INTERVAL=5*1000; ///<summary> ///构造函数1,说明了两个池是同步的。 ///</summary> staticObjectPool() { locked=Hashtable.Synchronized(newHashtable()); unlocked=Hashtable.Synchronized(newHashtable()); } ///<summary> ///初始化时间间隔,时间间隔触发事件,释放清理对象池的对象 ///</summary> internalObjectPool() { _lastCheckOut=DateTime.Now.Ticks; System.Timers.TimeraTimer=newSystem.Timers.Timer(); aTimer.Enabled=true; aTimer.Interval=GARBAGE_INTERVAL; aTimer.Elapsed+=newElapsedEventHandler(CollectGarbage); } ///<summary> ///建立一个数据库连接 ///</summary> ///<returns></returns> protectedabstractobjectCreate(); ///<summary> ///判断数据库连接是否正常 ///</summary> ///<paramname="o"></param> ///<returns></returns> protectedabstractboolValidate(objecto); ///<summary> ///延迟的连接被关闭 ///</summary> ///<paramname="o"></param> protectedabstractvoidExpire(objecto); ///<summary> ///Sql连接超出指定时间后的垃圾回收 ///</summary> ///<paramname="sender"></param> ///<paramname="ea"></param> privatevoidCollectGarbage(objectsender,ElapsedEventArgsea) { lock(this) { objecto; longnow=DateTime.Now.Ticks; IDictionaryEnumeratore=unlocked.GetEnumerator(); try{ while(e.MoveNext()) { o=e.Key; if(now-((long)unlocked[o])>GARBAGE_INTERVAL) { unlocked.Remove(o); Expire(o); o=null; } } } catch{} } } ///<summary> ///获得数据库连接 ///</summary> ///<returns></returns> internalobjectGetObjectFromPool() { longnow=DateTime.Now.Ticks; _lastCheckOut=now; objecto=null; lock(this) { try { foreach(DictionaryEntrymyEntryinunlocked) { o=myEntry.Key; if(Validate(o)) { unlocked.Remove(o); locked.Add(o,now); return(o); } else { unlocked.Remove(o); Expire(o); o=null; } } } catch(Exception){} o=Create(); locked.Add(o,now); } returno; } ///<summary> ///清除数据库连接 ///</summary> ///<paramname="o"></param> internalvoidReturnObjectToPool(objecto) { if(o!=null) { lock(this) { locked.Remove(o); unlocked.Add(o,DateTime.Now.Ticks); } } } } }

3.2 DBConnectionSingleton类 - 数据库连接池(实现了ObjectPool类的Create,Validate,Expire方法,并使用了单例模式)

[c-sharp]view plaincopyusingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Data.SqlClient; namespaceSqlPool { classDBConnectionSingleton:ObjectPool { privateDBConnectionSingleton(){} ///<summary> ///以单例模式创建数据库连接池 ///</summary> publicstaticreadonlyDBConnectionSingletonInstance=newDBConnectionSingleton(); privatestaticstring_connectionString=@"DataSource=192.168.168.251/Sql;InitialCatalog=XX;UserID=sa;Password=777"; ///<summary> ///数据库连接字符串 ///</summary> publicstaticstringConnectionString { set{ _connectionString=value; } get { return_connectionString; } } ///<summary> ///创建数据库连接 ///</summary> ///<returns></returns> protectedoverrideobjectCreate() { SqlConnectiontemp=newSqlConnection(_connectionString); temp.Open(); returntemp; } ///<summary> ///判断DB是否已连接 ///</summary> ///<paramname="o"></param> ///<returns></returns> protectedoverrideboolValidate(objecto) { try { SqlConnectiontemp=(SqlConnection)o; return(!((temp.State.Equals(System.Data.ConnectionState.Closed)))); } catch { returnfalse; } } ///<summary> ///关闭DB连接 ///</summary> ///<paramname="o"></param> protectedoverridevoidExpire(objecto) { try { ((SqlConnection)o).Close(); } catch{ } } ///<summary> ///获得DB连接 ///</summary> ///<returns></returns> publicSqlConnectionBorrowDBConnection() { try { return((SqlConnection)base.GetObjectFromPool()); } catch(Exceptione){ throwe; } } ///<summary> ///清除DB连接 ///</summary> ///<paramname="e"></param> publicvoidReturnDBConnecion(SqlConnectione) { base.ReturnObjectToPool(e); } } }

3.3 Main函数

[c-sharp]view plaincopyusingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Data.SqlClient; namespaceSqlPool { classProgram { staticvoidMain(string[]args) { DBConnectionSingletonpool; //获得数据库连接池的单例模式。 pool=DBConnectionSingleton.Instance; DBConnectionSingleton.ConnectionString=@"DataSource=192.168.168.251/Sql;InitialCatalog=XX;UserID=sa;Password=777"; SqlConnectionmyConnection=pool.BorrowDBConnection(); pool.ReturnDBConnecion(myConnection); System.Threading.Thread.Sleep(5000); } } }

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。