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

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

  1 分布式数据库系统

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

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

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

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

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

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

  2 远程处理框架和ADO.Net

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

  2.1 .Net远程处理框架

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

图1 远程处理过程

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

  2.2 ADO.Net

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

  2.2.1 ADO.Net管理数据一致性

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

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

  3 实例开发

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

  3.1 系统设计

  3.1.1系统结构图

  系统结构如图2所示:


图2 系统结构图

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

  3.1.2 系统实现步骤

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

  3.2系统实现的关键技术

  3.2.1 远程对象的发布与获取

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

  远程对象的发布:

//创建一个通道实例,port为指定的网络端口号
TcpChannel MyChannel= new TcpChannel (Int32.Parse(port));
//注册通道
ChannelServices.RegisterChannel(MyChannel);
//发布该服务器端激活对象
RemotingConfiguration.RegisterWellKnownServiceType( typeof ( DbServer ), "STORE", WellKnownObjectMode.Singleton);
远程对象的获取:
//根据IP地址和端口号获取相应的远程对象
try
{myDbServer=(DbServer)Activator.GetObject(typeof(DbServer),"tcp://"+ip+":"+p+"/STORE"); }
//捕捉异常
catch( NullReferenceException nullExp )
{MessageBox.Show( "指定的url地址不可到达 " + nullExp.Message );}
catch( RemotingException remExp )
{MessageBox.Show( "指定获得的对象定义不对" + remExp.Message );}

  3.2.2数据库的访问

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

//建立数据库的连接
string SqlConn = "Initial Catalog=Store;Data Source=Localhost;Userid=sa;Password=;";
SqlConnection Conn= new SqlConnection
(SqlConn);
Conn.Open();//打开数据库
//将数据源中的数据导入到数据集对象
try{
DataSet ds = new DataSet();
DataTable dt=new DataTable("Result");
SqlDataAdapter adapter=new SqlDataAdapter();
SqlCommand mySqlDataSetCmd =new SqlCommand
(CmdString,Conn);//CmdString为要执行的命令
adapter.SelectCommand= mySqlDataSetCmd;
adapter.Fill(dt);
ds.Tables.Add(dt); }
finally
{ Conn.Close();//关闭数据库的连接}

  3.2.3 查询

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

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

  4 结束语

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

(0)

相关推荐

  • C#连接数据库和更新数据库的方法

    对数据库的操作总体可以分为两类:查询(select)和更新(insert,delete,update).为什么这样来分呢?仔细看看两类的区别,select只是从数据库中将数据拿出来使用,而其余三者都会对数据库的物理数据进行修改.这篇文章将接着阐述更新数据. 更新数据库信息首先是连接数据库,对数据库的更新需要一个对象:OleDbCommand.该对象表示要对数据源执行的SQL语句或存储过程. 这个对象有三个属性:1.CommandText表示要设置命令的文本:2.Connection表示要设置命令

  • C#连接操作 MySQL 数据库实例(使用官方驱动)

    MySQL 以其免费和足够的性能受到很大的青睐,当然对于国内小公司,甚至是大公司如果对版权看得薄,敢冒险的话,随便装个 SqlServer.DB2.Oracle 都行.对于 SqlServer 数据库,因其与 MS 是一家,自然在 .net 类库中有内建支持,假如 MySQL 就得找第三方的驱动了 -- .net 中多讲 Provider.在这里我也是作为一个预研专题,记录下 C# 连接 MySQL 的两种方法,分别使用 MySQL 官方的和 SourceForge 上一个开源的 MySQL 驱

  • C#动态创建Access数据库及表的方法

    本文实例讲述了C#动态创建Access数据库及表的方法.分享给大家供大家参考. 具体实现方法如下: 复制代码 代码如下: //添加两个com组件引用 //Microsoft ADO Ext. 2.8 for DDL and Security //Microsoft ActiveX Data Objects 2.8 Library using System; using System.Collections.Generic; using System.Linq; using System.Text

  • c#数据绑定之向查询中添加参数(.Net连接外部数据库)

    在ACCESS数据库中可以用MSSQL的形式定义操作字符串,也可以采用OLEDB的形式. MSSQL 形式 复制代码 代码如下: string sqlText = @"SELECT * FROM [User] WHERE UserName= @name"; OLEDB的形式 复制代码 代码如下: string sqlText = @"SELECT * FROM [User] WHERE UserName= ?"; 下一步是通过 OleDbCommand执行操作. 复

  • C#连接mysql数据库完整实例

    本文实例讲述了C#连接mysql数据库的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Configuration; using MySql.Data.MySqlClient; /// <summary> /// TestDatebase 的摘要说明 /// </summary> public class TestDatebase { public TestDatebase() { // // TODO: 在此处添加构造函数逻辑

  • C#创建数据库及附加数据库的操作方法

    本文实例讲述了C#创建数据库及附加数据库的操作方法.分享给大家供大家参考,具体如下: /// <summary> /// 附加数据库方法 /// </summary> /// <param name="strSql">连接数据库字符串,连接master系统数据库</param> /// <param name="DataName">数据库名字</param> /// <param name

  • C#查询SqlServer数据库并返回单个值的方法

    本文实例讲述了C#查询SqlServer数据库并返回单个值的方法.分享给大家供大家参考.具体实现方法如下: static public string GetSqlAsString(string sqlText, SqlParameter[] sqlParameters, string databaseConnectionString) { string result = ""; SqlDataReader reader; SqlConnection connection = new S

  • c#连接数据库及sql2005远程连接的方法

    一:C#连接SQL数据库 复制代码 代码如下: Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;Data Source=190.190.200.100,1433;Network Library=DBMSSOCN;Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;Server=m

  • C#自动创建数据库实现代码

    using System;  using System.Data;  using System.Configuration;  using System.Collections;  using System.Web;  using System.Web.Security;  using System.Web.UI;  using System.Web.UI.WebControls;  using System.Web.UI.WebControls.WebParts;  using System.

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

    随着传统的数据库.计算机网络和数字通信技术的飞速发展,以数据分布存储和分布处理为主要特征的分布式数据库系统的研究和开发越来越受到人们的关注.但由于其开发较为复杂,在一定程度上制约了它的发展.基于此,本文提出了在.Net环境下使用一种新的开发语言C#结合ADO.Net数据访问模型来开发分布式数据库系统,大大简化了开发过程. 1 分布式数据库系统 就其本质而言,分布式数据库系统的数据在逻辑上是统一的,而在物理上却是分散的.与集中式数据库相比它有如下主要优点: · 解决组织机构分散而数据需要相互联系的

  • 基于PostgreSQL/openGauss 的分布式数据库解决方案

    在 MySQL ShardingSphere-Proxy 逐渐成熟并被广泛采用的同时,ShardingSphere 团队也在 PostgreSQL ShardingSphere-Proxy 上持续发力.相比前期的 alpha 与 beta,5.0.0 正式版对 PostgreSQL 的协议实现.SQL 支持度.权限控制等方面进行了大量的完善,为后续全面对接 PostgreSQL 生态打下基础.ShardingSphere-Proxy 与 PostgreSQL 的生态对接,让用户能够在 Postg

  • YII2数据库查询实践

    初探yii2框架,对增删改查,关联查询等数据库基本操作的简单实践. 数据库配置. /config/db.php 进行数据库配置 实践过程中有个test库->test表->两条记录如下 mysql> select * from test; +----+--------+ | id | name | +----+--------+ | 1 | zhuai | | 2 | heng | +----+--------+ 18 rows in set (0.00 sec) sql 查询方式 yii

  • Python中用memcached来减少数据库查询次数的教程

    本来我一直不知道怎么来更好地优化网页的性能,然后最近做python和php同类网页渲染速度比较时,意外地发现一个很简单很白痴但是 我一直没发现的好方法(不得不BS我自己):直接像某些php应用比如Discuz论坛那样,在生成的网页中打印出"本页面生成时间多少多少秒",然后在 不停地访问网页测试时,很直观地就能发现什么操作会导致瓶颈,怎样来解决瓶颈了. 于是我发现SimpleCD在 生成首页时,意外地竟然需要0.2秒左右,真真不能忍:对比Discuz论坛首页平均生成才0.02秒,而Dis

  • 利用PHP访问MySql数据库的逻辑操作以及增删改查的实例讲解

    PHP访问MySql数据库 <?php //造连接对象 $db = new MySQLi("localhost","root","","0710_test"); //写SQL语句 $sql = "select * from student"; //检测连接数据库是否成功,失败返回"连接失败",并退出程序 if(mysqli_connect_error()){ die("连

  • MySql数据库查询中的特殊命令

    第一:   MySQL的安装 下载MySQL软件,修改安装路径之后 安装数据库MySQL5.7.18 第一步:数据库MySQL5.7.18可以在官网上下载对应的版本,下载地址:http://www.filehorse.com/download-mysql-64/, 第二步:将下载好的安装包进行解压到一个盘下面, 第三步:配置环境变量,新建环境变量MySQL_HOME,输入MySQL的安装目录, 然后再把;%MYSQL_HOME%\bin插入到Path的最后面: 第四步:以管理员的身份运行命令行,

  • Spring+Mybatis+Mysql搭建分布式数据库访问框架的方法

    一.前言 用Java开发企业应用软件, 经常会采用Spring+MyBatis+Mysql搭建数据库框架.如果数据量很大,一个MYSQL库存储数据访问效率很低,往往会采用分库存储管理的方式.本文讲述如何通过Spring+Mybatis构建多数据库访问的架构,并采用多线程提升数据库的访问效率. 需要说明一下,这种方式只适合数据库数量.名称固定,且不是特别多的情况.针对数据库数量不固定的情况,后面再写一篇处理方案. 二.整体方案 三.开发环境准备 3.1 下载Spring.Mybatis.Mysql

  • Python的Django框架实现数据库查询(不返回QuerySet的方法)

    一.创建模型类: # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models class Course(models.Model): """课程表""" name = models.CharField(verbose_name='课程名称', max_length=255) description = models.Tex

  • 利用Navicat Premium导出数据库表结构信息至Excel的方法

    因为要编写设计文档,需要用到数据库表结构,想要在word文档中以二维表格的形式展示,故借助Excel形成二维表格样式,还是很方便的样子! 1.新建查询,并将以下SQL语句修改至需要 SELECT COLUMN_NAME 列名, COLUMN_TYPE 数据类型, DATA_TYPE 字段类型, CHARACTER_MAXIMUM_LENGTH 长度, IS_NULLABLE 是否为空, COLUMN_DEFAULT 默认值, COLUMN_COMMENT 备注 FROM INFORMATION_

  • 如何利用C++实现mysql数据库的连接池详解

    目录 为什么是mysql? 为什么要搞资源池? mysql资源池实现的案例源码 头文件:MysqlPool.h 实现文件:MysqlPool.cpp 测试函数 总结 为什么是mysql? 现在几乎所有的后台应用都要用到数据库,什么关系型的.非关系型的:正当关系的,不正当关系的:主流的和非主流的, 大到Oracle,小到sqlite,以及包括现在逐渐流行的基于物联网的时序数据库,比如涛思的TDengine,咱们中国人自己的开源时序数据库,性能杠杠滴. 凡此总总,即使没用过,也听说过,但大部分人或企

随机推荐