ASP.NET开发框架之HIPPO技术内幕(三)--数据库连接

简介:

三、数据库连接

    上一章讲的是本系统的核心部分,Meta-Data驱动方式,本章来讲一下数据库的连接。

    本系统的设计目标是支持多种数据库,所以在设计的时候就要在这上面多考虑一下。

    说到多数据库支持,有些地方也叫做“数据库无关”,就是不管客户选择什么样的数据库,都可以支持。其实我这个系统目前也只能做到支持MSSQL及Oracle,因为这两个数据库属于企业级数据库,并且在国内的用户量应该是最大的,Access因为它太过弱小,所以没有对它做太多的处理,对于其它的数据库,如果想增加支持,只要在这个模块中做一点处理就可以。

    为了实现多数据库的支持,目前有两种比较流行的做法:

        u 使用标准的ODBC或OleDB

        u 针对不同的数据库写不同的SQL语句

    第一种方式,在数据库扩展上能力相当强,因为它相当于使用的基本全是标准的SQL语法,尽量避开每个数据库特有的东西;而第二种方式则不管这一套,可以尽情的使用每个数据库的特色。第一种方式在灵活的同时也在不同程度上损失了数据库的性能,而第二种方式则在这方面有所增强,但是扩展数据库显得有些麻烦。我的系统采用的是第二种方式。

    尽管对每个数据库要写不同的组件,但是在其它模块调用的时候,不应该再去考虑数据库属于何种类型,起码大部分情况不需要知道,这地方就是我要说的一个技巧,使用接口技术来实现。

    interface IData

    这个接口定义几个方法:

int ExecuteNonQuery(string commandText);

int ExecuteNonQuery(string[] sqls);

DataSet ExecuteReader(string sql);

string ExecuteScalar(string commandText);

    然后再建立两个类来实现这个接口,分别叫做OracleData 和SqlData,把上述的几个方法全部重新实现,在这两个类中,会用到OracleClient和SqlClient,这就摆明了可以允许利用各自数据库的特色进行开发。

    不管怎么做“与数据库无关”,但是系统最终还是必须知道到底用的是什么数据库,这些信息我全部用一个专门的配置文件来存储,而没有使用web.config,这样保证我这个类可以用于各种场景,而不会局限于BS结构。这个文件的命名为 config.xml,其内容如下:

<?xml version="1.0" encoding="utf-8" ?>

<config>

<connection>

<connection_name>test</connection_name>

<type>ORACLE</type>

<server></server>

<database></database>

<user>test</user>

<password>weJhxRH71Ds=</password>

<minpoolsize>10</minpoolsize>

</connection>

</config>

    这个文件中有以下几个部分的内容我来说明一下

connection_name

连接的名字,只是一个标识,不会被系统使用

type

用于区分Oracle或MSSQL

server

指明数据库的来源,oracle使用TNS名字,为空表示本机,MSSQL使用连接名,如(local)等

database

只对MSSQL有效,指明操作的数据库

user

连接用户名

password

加密形式存在,保证文件不会被轻易破解,系统会把这个密码反向解开得到真正的密码来使用

minpoolsize

用于配置连接池,标准的asp.net的功能

    程序中有一个专门对外的类,叫做DataAccessor,负责外界对数据库的调用,这个类首先会去查找config.xml这个文件,检查其中的数据库类型,根据不同的类型,会把连接指引到OracleData或SqlData中去。DataAccessor同样封装了和IData 相同的几个函数,在外部调用的时候很方便,而且对config.xml的寻找完全在内部来实现,不需要外部的干预。为了系统的性能,在首次读入配置文件后,配置文件的内容会被写入到内存中,保证下次再读的时候不会产生IO操作。这样使用的负面效果就是当改动配置文件后,必须重新起动IIS才可以生效。

    上面提到的密码的加密存储,采用的是DES标准加密,而不是MD5的单向加密算法,保证系统能反向求出原密码,而DES加密后是二进制的形式,所以我又做了一个Base64的转换,保证可以存储在XML文件中。

    每种数据库都有自己的特别的语法,举个最简单的例子,判断一个函数是否为空,在MSSQL中使用的是 isnull 函数,而在oracle中使用的是 nvl 函数,这样在外部引用的时候,首先会判断数据源为何种数据库,再写不同的SQL语句来实现。这样看来,这种做法肯定是不能接受,它太麻烦了,所以我做了一个专门的类,叫做DBConverter,它有几个静态函数,专门负责不同数据库之间的兼容处理。对上面的是否为空的函数,就有一个专门的静态函数如下:

public static string NVL(string serverType)

{

switch(serverType.ToUpper())

{

case "ORACLE":

{

return "nvl";

}

case "MSSQL":

{

return "isnull";

}

default:

{

return "nvl";

}

}

}

    这样,在外部调用的时候,只要把DataAccessor的数据库类型作为参数传进去,就可以得到正确的表达方式,而不需要写不同的SQL来处理,这对多数据库支持起到了非常大的作用。以此类推,还可以把top 的语法写成函数来处理。当这种方式不能涵盖所有的数据库的时候,就有必要写单独的SQL来实现特定的功能了。

    由上可以看出,如果需要新的数据库支持,主要的修改在于去实现一个新的I Data接口,并对DataAccessor类进行扩展即可。

    再来说一下性能问题

    int ExecuteNonQuery(string commandText) 的内部,最后都有一个提交的动作,这样当然是为了保证数据的完整性,这种做法很正确,但是当有大量的DML操作的时候,会反复的调用此函数,会导致性能急剧下降,而int ExecuteNonQuery(string[] sqls)这个函数正是为了解决这一问题而存在的,在这个函数的内部,首先会开始一个事物处理,然后依次去运行sqls中指定的SQL语句,最后统一做一个提交的动作,这样会使效率提高很多。

    尽管上述方式能提高很多效率,但是说到底,每次SQL的提交都会有一个客户端到服务器的提交动作,即便IIS和oracle在同一台服务器,这个动作的负担也是相当重的,所以最好的方式是多做一些存储过程或package(oracle专享),尽量减少数据库与外界的交互,这样才可以达到真正的高效,针对这个技巧,我会在其它文章中做专门讨论。

    这里还有一个性能问题,DataSet ExecuteReader(string sql)是以结果集的形式返回,DataSet的特点是把返回结果集全部一起取出放在内存中使用,对于这种情况,可以尽可能的维持数据的完整性,是它的优势,但是如果表很大,就会花费很长的时间来装入内存,并且占用的内存量比原始数据表还要大很多。所以在使用的时候,尽可能的减少返回的记录,比如限制返回行数等,大量的返回结果对前端展示并没有太大的意义,在我的前端展示控件中,有一个专门的筛选器,可以很方便的进行记录的查找。这样可以从本质上提高性能。

    到此为止,数据库的连接部分基本搞定,下面来介绍多语言的实现方式。


本文转自Aicken(李鸣)博客园博客,原文链接:http://www.cnblogs.com/isline/archive/2010/04/15/1712620.html,如需转载请自行联系原作者

相关文章
|
11天前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
29天前
|
SQL 数据库连接 数据库
你不知道ADo.Net中操作数据库的步骤【超详细整理】
你不知道ADo.Net中操作数据库的步骤【超详细整理】
16 0
|
1月前
|
SQL 数据库 C#
C# .NET面试系列十一:数据库SQL查询(附建表语句)
#### 第1题 用一条 SQL 语句 查询出每门课都大于80 分的学生姓名 建表语句: ```sql create table tableA ( name varchar(10), kecheng varchar(10), fenshu int(11) ) DEFAULT CHARSET = 'utf8'; ``` 插入数据 ```sql insert into tableA values ('张三', '语文', 81); insert into tableA values ('张三', '数学', 75); insert into tableA values ('李四',
62 2
C# .NET面试系列十一:数据库SQL查询(附建表语句)
|
1月前
|
SQL 开发框架 数据可视化
企业应用开发中.NET EF常用哪种模式?
企业应用开发中.NET EF常用哪种模式?
|
2月前
|
开发框架 JavaScript 前端开发
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
5个.NET开源且强大的快速开发框架(帮助你提高生产效率)
|
2月前
|
开发框架 Oracle 关系型数据库
ASP.NET实验室LIS系统源码 Oracle数据库
LIS是HIS的一个组成部分,通过与HIS的无缝连接可以共享HIS中的信息资源,使检验科能与门诊部、住院部、财务科和临床科室等全院各部门之间协同工作。 
35 4
|
3月前
|
存储 NoSQL API
一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库
一个小巧、快速、轻量级的 .NET NoSQL 嵌入式数据库
135 0
|
3月前
|
SQL 关系型数据库 MySQL
Python 数据库访问与ORM框架——打造高效开发利器
Python 作为一门广泛使用的编程语言,其在数据库访问方面也有着较为成熟的解决方案,其中ORM框架更是成为了开发者们的首选。本文将介绍 Python 中数据库访问和 ORM 框架的基本概念,以及如何使用 SQLAlchemy 这一优秀的 ORM 框架进行开发。
|
3月前
|
缓存 数据库 索引
高效后端开发:数据库优化策略详解
数据库优化是后端开发中不可或缺的一部分。本文将从多个方面详细阐述数据库优化策略,包括数据表设计、索引优化、查询性能优化等。通过本文的学习,读者可以了解如何优化数据库,提升后端应用性能和稳定性。
69 1
|
4天前
|
开发框架 前端开发 JavaScript
采用C#.Net +JavaScript 开发的云LIS系统源码 二级医院应用案例有演示
技术架构:Asp.NET CORE 3.1 MVC + SQLserver + Redis等 开发语言:C# 6.0、JavaScript 前端框架:JQuery、EasyUI、Bootstrap 后端框架:MVC、SQLSugar等 数 据 库:SQLserver 2012