c#

位置:IT落伍者 >> c# >> 浏览文章

利用C#实现分布式数据库查询


发布日期:2021年11月16日
 
利用C#实现分布式数据库查询

随着传统的数据库计算机网络和数字通信技术的飞速发展以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注但由于其开发较为复杂在一定程度上制约了它的发展基于此本文提出了在Net环境下使用一种新的开发语言C#结合ADONet数据访问模型来开发分布式数据库系统大大简化了开发过程

分布式数据库系统

就其本质而言分布式数据库系统的数据在逻辑上是统一的而在物理上却是分散的与集中式数据库相比它有如下主要优点

· 解决组织机构分散而数据需要相互联系的问题

· 均衡负载负载在各处理机间分担可避免临界瓶颈

· 可靠性高数据分布在不同场地且存有多个副本即使个别场地发生故障不致引起整个系统的瘫痪

· 可扩充性好当需要增加新的相对自主的组织单位时可在对当前机构影响最小的情况下进行扩充

分布式数据库系统虽然有诸多优点但它同时也带来了许多新问题数据一致性问题数据远程传递的实现通信开销的降低等这使得分布式数据库系统的开发变得较为复杂幸运的是微软的Net开发环境为我们提供了C#开发语言和ADONet数据访问模型结合两者来开发分布式数据库系统能够大大简化开发工作

远程处理框架和ADONet

开发分布式数据库系统需要解决的两个重要问题是各场地间的数据通信以及对数据库的操作及管理使用C#结合ADONet能够高效可靠地解决这两方面的问题具体表现为在C#中通过使用Net远程处理框架能够方便地解决数据命令远程传递问题C#通过ADONet对数据库进行操作使分布式数据库系统中对数据库的各种操作变得高效可靠同时易于解决数据一致性问题

Net远程处理框架

实现数据和命令的远程传递有三种方式第一种是使用报文或消息的方式把要传送的数据转化为流格式再通过套接字编程用报文的形式发送到远程主机此种方法麻烦不易实现第二种是使用Web Service即各远程主机提供一个数据库查询服务的Web Service这种方式只能对单个场地进行查询无法实现多场地的联合查询第三种是使用Net远程处理框架(Net Remoting Framework)技术它将远程调用的技术细节隐藏起来服务程序只需通过简单的设置就可以把本地对象变成为远程提供服务的远程对象客户端可以像访问本地对象一样透明地访问远程对象所有的消息报文等都交给Net Remoting对象处理大大简化了开发远程处理的一般过程如图所示

远程处理过程

首先服务器端创建一个服务器类的实例远程处理系统创建一个表示该类的代理对象并向客户端对象返回一个对该代理的引用当客户端调用方法时远程处理基础结构连接检查类型信息并通过信道将该调用发送到服务器进程侦听信道获得该请求并将其转发给服务器远程处理系统服务器远程处理系统查找(或在必要时创建)并调用被请求的对象然后此过程将反向进行服务器远程处理系统将响应捆绑成消息并由服务器信道发送到客户端信道最后客户端远程处理系统通过代理将调用的结果返回给客户端对象

ADONet

ADONet以XML为核心Net数据库应用程序的解决方案它使用离线数据结构数据源中的数据被缓存到数据集(DataSet)对象中用户无须锁定数据源数据以XML格式保存

ADONet管理数据一致性

在分布式数据库系统中很可能出现多个用户同时访问和修改数据的情况因此对于分布式数据库系统数据一致性是不可或缺的ADONet通过使用乐观一致性方案来控制数据一致性(实际上DataSet对象被设计成支持使用乐观一致性控制机制)即数据行只有在数据库中真正被更新时才会被锁定而在悲观一致性方案中数据行在从被提取出来到在数据库中更新这段时间内一直被锁定因此使用ADONet能够在更少的时间内响应数量巨大的用户

另外在分布式数据库系统中还会经常遇到当用户修改自从提取出来以来已经被修改的行时违反一致性原则对此问题ADONet也作了很好地解决即使用DataSet对象为每一条修改过的记录维护两个版本原始版本和更新版本在更新的记录被写回数据库之前先要把数据集中记录的原始版本与数据库中的当前版本进行比较如果两个版本匹配就在数据库中更新记录否则就会出现违反一致性原则的错误

实例开发

一个家用电器连锁店设有一个总部和许多分店总部和分店以及各分店之间经常需要进行各种信息的查询(如商品当日价目表各店销售状况和库存信息等)对此组织机构建立分布式数据库查询系统可实现总部和各店信息的共享便于统一管理

系统设计

系统结构图

系统结构如图所示

系统结构图

总部和各分店都配置了一台具有固定IP的服务器其它电脑通过集线器与服务器相连总部和各分店的服务器通过通信网络联接起来

系统实现步骤

系统实现分为三个主要步骤首先为总部和各分店设计数据库由于数据量较大故采用SQL Server为每个分店创建销售和库存数据库同时为总部创建员工数据库整个连锁店的存货数据库信用卡客户数据库以及供应商信息数据库等其次需要建立一个提供数据库服务(DbServer)的动态链接库(dll)将查询时所要用到的一些服务(如远程对象的发布和获取等)和函数(如本地异地数据表的查询数据表的远程创建和删除表间的连接和合并等)置入该dll中各分店都需要使用这个dll以便查询时对一些服务和函数进行调用最后根据实际需要开发客户端查询界面

系统实现的关键技术

远程对象的发布与获取

系统运行后所要做的第一个工作是发布本地的远程对象并获取其它各店所发布的远程对象发布远程对象时首先要设置一个网络端口号然后创建并注册一个通道最后发布该服务器端的激活对象其它场地的服务器根据IP地址和网络端口号即可方便地获取所发布的远程对象实现远程对象发布和获取的关键代码如下

远程对象的发布

//创建一个通道实例port为指定的网络端口号

TcpChannel MyChannel= new TcpChannel (IntParse(port));

//注册通道

ChannelServicesRegisterChannel(MyChannel);

//发布该服务器端激活对象

RemotingConfigurationRegisterWellKnownServiceType( typeof ( DbServer ) STORE WellKnownObjectModeSingleton);

远程对象的获取

//根据IP地址和端口号获取相应的远程对象

try

{myDbServer=(DbServer)ActivatorGetObject(typeof(DbServer)tcp://+ip+:+p+/STORE); }

//捕捉异常

catch( NullReferenceException nullExp )

{MessageBoxShow( 指定的url地址不可到达 + nullExpMessage );}

catch( RemotingException remExp )

{MessageBoxShow( 指定获得的对象定义不对 + remExpMessage );}

数据库的访问

通过ADONet访问数据库可以方便地连接数据库将数据源中的数据导入DataSet对象中在DataSet对象中可对数据表进行各种操作而且DataSet对象本身也可远程传递这为开发分布式数据库系统带来极大方便实现数据库访问的关键代码如下所示

//建立数据库的连接

string SqlConn = Initial Catalog=Store;Data Source=Localhost;Userid=sa;Password=;;

SqlConnection Conn= new SqlConnection

(SqlConn);

ConnOpen();//打开数据库

//将数据源中的数据导入到数据集对象

try{

DataSet ds = new DataSet();

DataTable dt=new DataTable(Result);

SqlDataAdapter adapter=new SqlDataAdapter();

SqlCommand mySqlDataSetCmd =new SqlCommand

(CmdStringConn);//CmdString为要执行的命令

adapterSelectCommand= mySqlDataSetCmd;

adapterFill(dt);

dsTablesAdd(dt); }

finally

{ ConnClose();//关闭数据库的连接}

查询

分布式数据库系统中的查询一般分为三类本地查询远程查询和联合查询本地查询和集中式数据库的查询没什么区别对于远程查询只要获取远程对象后调用查询函数即可方便地实现最复杂的是联合查询涉及到多场地之间数据的查询表的远程创建传递连接合并等技术下面以实例介绍联合查询的实现

第二连锁店要查询离其较近的第三第四连锁店中所有北京的供应商所供应的空调的库存信息以便调货可通过以下步骤实现首先获取总部以及第三第四连锁店所发布的远程对象接着通过远程对象在总部创建一临时数据表t将查询到的所有北京的供应商信息存放在t表中(各分店只有供应商名并不知其所在地只有总部才有供应商的详细信息)再将t表保存到第三和第四连锁店然后让t表分别与两店的库存表作连接找出所有北京供应商所供应的空调库存信息(如空调名称型号个数价格等信息)并将连接结果t和t数据表返回到第二连锁店最后对t和t两表进行合并并使用DataGrid控件显示出来上述实现中包含了不同场地之间数据表的复制传递连接等所用到的一些函数(如远程创建数据表表与表间的远程连接合并等)都放在dll中可以方便地调用

结束语

利用C#的Net Remoting技术能够方便地解决各场地间数据的通信问题另外C#通过ADONet访问数据库使得对数据库的操作及管理变得更加高效可靠这两种技术的使用有效地解决了开发分布式数据库系统的主要问题大大减轻了系统开发工作量并且提高了系统的可靠性和安全性

上一篇:简单介绍C#冒泡排序

下一篇:微软效仿Eclipse推Visual Studio 2008 She