数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

基于单件模式的数据库连接组件的设计


发布日期:2020年08月04日
 
基于单件模式的数据库连接组件的设计

摘 要当前在开发多用户信息管理系统时常用的数据库连接方法存在着不足当客户端较多时会在服务端建立过多的连接占用服务器很多宝贵的资源针对这种不足提出一种改进的方案结合单件设计模式的特点和组件的技术建立了一个数据库连接组件通过调用该连接组件可以实现应用程序中的所有访问数据的操作共用一个连接的目的从而减轻了服务器的负担提高了程序性能经实际测试该设计达到了预期的效果

关键字DOTNET组件数据库连接设计模式

引言

目前无论是基于C/S结构或是基于B/S结构的信息管理系统一般都采用多层结构设计也即表示层业务逻辑层数据访问层数据库在这种多层结构的设计中客户端直接通过广域网或局域网与数据库进行交换数据由于数据库(如Oracle或SQL Server)支持的用户有限如果连接的用户过多数据库将出现异常影响数据库的处理能力同时客户端可能打开多个访问的页面有可能每一个页面请求将导致一次数据库访问连接数据库不仅要开销一定的通讯和内存资源还必须完成用户验证安全上下文配置任务因而往往成为最为耗时的操作如果每个基于数据库的应用程序只建立一次初始连接不同页面请求能够共享同一连接就能获得显着的性能改善本文将介绍一种基于单件设计模式的组件设计技术实现这一要求的方法

设计模式

所谓模式就是一些能够完成特定任务并达到完成工作的方案途径或现成技术一个模式是一种技术为了完成某项工作我们必须获取并利用有效的技术这种思想也可以用于除软件开发领域之外的其他工作中在软件开发领域我们称之为设计模式它就是一种完成某个目的或构想的方案而且它要求使用某种面向对象语言提供的类以及相关机制如果开发人员在设计代码时加入设计模式的思想可以使使用面向对象语言编写出的程序更简洁而且工作得更可靠高效

单件模式是《Design Patterns》一书(GoF——四人小组编写)中描述了种设计模式中的一种单件模式就是要求类生成且仅能生成一个实例它的实现细节可参见后面的代码

认识软件组件技术

随着计算机软件技术的发展组件技术在软件开发领域得到越来越多的应用组件技术已经成为计算机环境中的基本组成之一软件组件是可复用的软件组成成分可被用来构造其他软件他可以是被封装的对象类类树一些功能模块软件框架软件构架文档分析件设计模式等其具有独立性互换性功能性通用性预制性等性质软组件技术是基于面向对象的以嵌入后马上可以使用的即插即用型软件组件概念为中心通过组件的组合来建立应用的技术体系

Microsoft的VSNET系统开发工具提供了对组件模型的实现支持我们建立一个基于ADONET数据库公共连接组件以供以后开发中使用或者供其他开发者使用实现一个应用程序只使用一个数据库连接

DOTNET中的连接池的管理机制及其不足

DOTNET系统自己提供连接池管理的机制

)池的创建与分配

当连接打开时将根据一种精确的匹配算法来创建连接池该算法会使连接池与连接中的字符串相关联?每个连接池都与一个不同的连接字符串相关联当新连接打开时如果连接字符串不精确匹配现有池则将创建一个新池连接池一旦创建直到活动进程终止时才会被毁坏非活动或空池的维护只需要最少的系统开销

)连接的添加

连接池是为每个唯一的连接字符串创建的当创建一个池后将创建多个连接对象并将其添加到该池中以满足最小池大小的要求连接将根据需要添加到池中直至达到最大池大小

当请求 SqlConnection 对象时如果存在可用的连接则将从池中获取该对象若要成为可用连接该连接当前必须未被使用具有匹配的事务上下文或者不与任何事务上下文相关联并且具有与服务器的有效链接

如果已达到最大池大小且不存在可用的连接则该请求将会排队当连接被释放回池中时连接池管理程序通过重新分配连接来满足这些请求对 Connection 调用 Close 或 Dispose 时连接被释放回池中

) 连接的移除

如果连接生存期已过期或者连接池管理程序检测到与服务器的连接已断开连接池管理程序将从池中移除该连接请注意只有在尝试与服务器进行通信后才可以检测到这种情况如果发现某连接不再连接到服务器则会将其标记为无效连接池管理程序会定期扫描连接池查找已释放到池中并标记为无效的对象找到后这些连接将被永久移除

)DOTNET中自带的连接池管理机制存在着一定的不足

第一建立的连接一定要及时关闭如果程序员在编写程序的时候未将打开的连接关闭当连接数目达到一定数目的时候系统就会因为连接数过大而不能正常运行

第二DOTNET自带的连接池存在不稳定性如果存在与已消失的服务器的连接那么即使连接池管理程序未检测到已断开的连接并将其标记为无效仍有可能将此连接从池中取出当发生这种情况时将生成异常但是为了将该连接释放回池中仍必须将其关闭

对于上述不足在应用程序中进行处理显然是以牺牲应用程序的性能为代价的甚至是难以处理的

基于单件模式的数据库连接组件解决方案

在一个应用程序中共用一个数据库连接当有用户启动此应用程序的时候系统将检查当前连接的状态如果连接是关闭的就打开这个连接在整个应用程序执行期间该连接始终保持打开状态下一个用户进入应用程序需要连接数据库时就直接使用当前已经打开的连接当所有用户都退出应用程序触发DOTNET应用程序的ApplicadonEnd事件在此事件中将该连接关闭在应用程序运行期间共用一个连接的情况下用户对数据库数据的操作通过事务来控制以保证在一个公用连接下数据的并发操作

通过此方案可以很好的解决DOTNET中自带的连接池管理机制存在的不足

要使所作的组件能够作为公共连接组件使用具有一定的可复用性必须首先确立组件的组件模型使它具有统一的接口和规范根据组件模型开发应用组件 NET Framework 中组件是指实现 SystemComponentModelIComponent 接口的一个类或从实现 IComponent 的类中直接或间接派生的类另外NET Framework 还提供控制外部资源和设计时支持等功能如果设计的组件需要控制外部资源还必须扩展 SystemIDisposable 接口即在组件重载 Dispose 方法实现中组件必须显式释放外部资源与垃圾回收过程中发生的默认不确定的清理相比这提供了一个确定的方法来释放资源开发人员必须在整个包容层次结构中传播 Dispose 以确保组件的子级也释放资源而且派生的组件必须调用其基类的 Dispose 方法由于数据连接组件所占系统资源很少所以不考虑扩展SystemIDisposable接口组件类继承自IComponent接口组件只提供一个生成实例的接口(CreateConn)和一个获取打开连接的接口供用户调用

组件实现

考虑到网络安全性和易维护性将数据库连接字符串放在应用程序服务器下的一个XNL文件中在程序运行时读取XML文件获取数据库连接字符串传递给连接组件应用程序通过调用连接组件打开连接并返回一个数据库连接实例在整个应用程序中使用这个数据库连接实例就可以在应用程序结束时关闭连接如果数据库连接有所变动可以通过XML文件进行修改免去了数据库连接变动就要修改源程序代码的麻烦

C#实现的基于单件模式的ADONET数据库公共连接组件代码如下

namespace UtilitiesCommon

{

public class DataConnection

{

private static SqlConnection _conn = null;

private string _connString;

private static object _classlock = typeof(DataConnection);

private static DataConnection _dc;

private static bool instance_flag=false;

private DataConnection() //定义私有构造函数防止用户生成实例

{

_connString = getConnString();

}

private string getConnString()

{

XmlDocument doc = new XmlDocument();

docLoad(connxml); //数据库连接设置的XML文件

string returnval = docDocumentElementChildNodes[]FirstChildValue;

doc = null;

return returnval;

}

public static DataConnection CreateConn() //静态类对外生成实例的接口

{

lock(_classlock) //生成实例前加锁保证只生成一个连接实例

{

if(!instance_flag)

{

_dc = new DataConnection();

}

}

return _dc;

}

public SqlConnection Open()

{

if(_conn==null)

{

_conn = new SqlConnection(_connString);

_connOpen();

}

return _conn;

}

public void Close()

{

if(_connState == SystemDataConnectionStateOpen)

{

_connClose();

_conn = null;

}

}

}

}

connXML文件的格式如下

Server=(local);uid=sa;pwd=;database=pubs

将名为DataConnection的组件经编译生成DLL文件后就可以在其他项目中引用此组件只要按connXML文件的约定建立好数据库的连接字符串在应用程序中通过调用该组件的Open()方法就可以获取连接到指定数据库的连接在应用程序中使用该组件的示例代码如下

DataSet ds = new DataSet();

SqlDataAdapter da = new SqlDataAdapter(select * from jobs

UtilitiesCommonDataConnectionCreateConn()Open());

daFill(ds);

结论

经过在一些实际应用程序中的使用充分证明了该组件确实能有效地改善应用程序的性能充分利用和保护了服务器的宝贵资源

参考文献

[] 郭玲玲边小凡 《DOTNET Web应用程序中公共连接组件的实现》 微机发展()

[] [美]Steven John Metsker 《C#设计模式》 中国电力出版社

[] 丁书耕张路崎辛艳芬《基于DOTNET平台的应用程序开发框架的研究》微机发展()

[] 李桂丽刘悦田莹 《可复用组件的制作和组装》鞍山钢铁学院学报()

               

上一篇:Excel导出时数据中有特殊字符的可能会出错

下一篇:数据控件数据绑定方法