zhuweisky

君子之行,静以修身,俭以养德。非淡泊无以明志,非宁静无以致远。
ESFramework,基于.NET的通信框架。DataRabbit,轻量的数据访问框架。DCFramework,基于.NET的动态分布式计算框架。sky.zhuwei@163.com

统计

留言簿

积分与排名

好友博客

阅读排行榜

评论排行榜

DataRabbit 企业级的数据访问框架(00) -- 序

   (最新版本为DataRabbit 3.2,请到本文末下载处下载。最后更新:2008.11.20)

   DataRabbit支持基于关系(Relation)的数据库操作和基于ORM的数据库操作,内置了对Oracle和SqlServer的支持,并且可以通过插件的方式对其它数据库类型提供支持。DataRabbit中的所有访问器(都实现了ITransactionAccesser接口)即可以在事务上下文中访问数据库,也可以在非事务中访问数据库。使用DataRabbit,几乎可以避免98%的需要在程序中手写的Sql语句,这样,你的程序会更安全,并且更容易修改和维护。

   在正式了解DataRabbit之前,也许先读一下《DataRabbit的背后(1)-―走进DataRabbit上下文》效果更好,这篇文章为了解DataRabbit做了一些必要的铺垫。

1.DataRabbit中的访问器  
   DataRabbit主要包含以下几种访问器:
(1)针对ORM的访问器(IOrmAccesser)(及 续篇
(2)针对数据库的Relation访问器(IRelationAccesser
(3)针对Table的Relation访问器(ITableAccesser
(4)针对存储过程的访问器(ISPAccesser
(5)基于ORM的对象关系加载器(IEntityRelationLoader
(6)数据大纲访问器(IDataSchemaAccesser

     所有的访问器都向使用者屏蔽了地层的IDbCommand、IDbConnection等对象,使用者不必再关心打开连接、执行命令、关闭连接等繁琐底层的操作。这些访问器都从ITransactionAccesser接口继承,它们的类图如下所示:



   DataRabbit的ORM非常轻量,它具有如下特点:
(1)使用Emit与泛型技术实现ORM访问器(IOrmAccesser),与手写SQL的效率几乎相当。
(2)使用ORM不需要任何配置文件(采用“约定”优于“配置”原则,Entity对象与数据表结构完全一致,可由工具EntityCreator自动生成)
(3)可以将数据库之间的主从表关系映射为Entity之间的关系,并可以依据主外键来加载Entity。
(4)对数据库表的结构没有任何要求。(比如,有的ORM框架要求数据表必须具有主键等)

(5)支持高效的“部分更新(partial update)”。

2.大纲操作 

   DataRabbit支持与数据大纲(DataSchema)相关的操作,比如提取某个数据库表的大纲,或者依据某个大纲创建对应的数据库表。这可以通过 IDataSchemaAccesser 接口来完成。与大纲操作相关的类图如下所示:




3.数据分页
   可以通过IPagerManager接口来进行数据分页操作(全部采用程序实现,不需要存储过程的支持)。



4.DataRabbit入口 -- TransactionScopeFactory     

     作为使用DataRabbit框架的入口点,一个TransactionScopeFactory实例就对应着一个数据库。

     也可以这么说,针对一个特定的数据库,我们的应用只需要维护一个TransactionScopeFactory实例即可。

DataConfiguration config = new DataConfiguration(DataBaseType.SqlServer, "localhost""sa""pwd""TestDB"null);
TransactionScopeFactory transactionScopeFactory 
= new TransactionScopeFactory();
transactionScopeFactory.DataConfiguration 
= config;            
transactionScopeFactory.Initialize();

     通过TransactionScopeFactory我们可以获取TransactionScope对象,而上述的各种访问器、大纲操作者、分页管理器等等实例都可以通过TransactionScope中的对应方法获得。

   比如,获取针对表Student的ORM访问器:

IOrmAccesser<Student> stuOrmAccesser = transationScope.NewOrmAccesser<Student>(null);
//获取所有年龄大于20岁的学生
IList<Student> stuList = stuOrmAccesser.GetMuch(new Filter(Student._Age, 20, ComparisonOperators.Greater));

     关于如何更好的使用DataRabbit框架,可以参考 使用DataRabbit的最佳实践 一文。

 

5.对N层架构的支持
   DataRabbit如何更好地融合到N层架构中了?如何支持BL层、Data层、BEM层?
(1)TransactionScope,事务范围,从某个事务返回对象获取的各种访问器实例都工作于同一个事务上下文中。TransactionScope实例通常在Business Flow子层中创建。
(2)将DataRabbit融入架构

(3)三层架构中使用DataRabbit的最佳实践 

(4)DataRabbit 对中大型高并发应用的支持

   在后续的文章中,会逐一介绍上面提到的各个DataRabbit组件,下面给出DataRabbit框架的最新版本dll下载,以及一个非常简单的ORM示例源程序,大家可以仿这段程序尝试一下DataRabbit的ORM功能。


资源下载:
1.最新版本DataRabbit 3.3下载(内含EntityCreator)!V3.3兼容V3.2(最后上传于 2009.04.28
2.DataRabbit 完全手册V1.0


其它文章:
(1)DataRabbit 3.0 ORM性能大幅度提升!
(2)DataRabbit 3.0 与 Linq to sql 性能比较
(3)Batch Insert 批插入!
(4)实体缓存EntityCache  (2008.05.28)


可以加入QQ群:37677395  一起探讨DataRabbit

 

posted on 2007-03-19 16:36 zhuweisky 阅读(7884) 评论(42)  编辑 收藏 网摘 所属分类: DataRabbit

评论

#1楼 2007-03-19 17:13 yunhuasheng      

very good!   回复  引用  查看    

#2楼 2007-03-19 17:32 亚历山大同志      

如果可能希望放出源码   回复  引用  查看    

#3楼 2007-03-19 17:52 我要购书网51goushu.com[未注册用户]

希望得到源代码   回复  引用    

#4楼 2007-03-19 18:19 JesseZhao      

还不错了   回复  引用  查看    

#5楼 2007-03-19 20:49 臭石头      

能否通过一千万数据的测试?   回复  引用  查看    

#6楼 2007-03-19 20:53 臭石头      

我做的一个ORM,通过了750万数据的测试   回复  引用  查看    

#7楼 2007-03-19 20:57 reonlyrun      

牛呀   回复  引用  查看    

#8楼 2007-03-19 21:51 henry      

@臭石头
这个能代表什么?
  回复  引用  查看    

#9楼 2007-03-19 22:06 臭石头      

看到LZ说“可以通过IPagerManager接口来进行数据分页操作(全部采用程序实现,不需要存储过程的支持)。”

就问了这个问题。

如果这个框架能在一千万数据上稳定工作,就表明用了正确的分页算法。数据量太少的时候,许多分页算法会滥竽充数。
  回复  引用  查看    

#10楼 2007-03-19 22:25 Apple[未注册用户]

nbear怎样   回复  引用    

#11楼 2007-03-19 23:14 阿齐      

很不错啊,感觉比IBatis.Net更近了一步,不知道能支持什么规模的数据?   回复  引用  查看    

#12楼 2007-03-19 23:39 reonlyrun      

@臭石头
能不能提供一份正确的分页算法?
  回复  引用  查看    

#13楼 2007-03-19 23:57 老是弄错[未注册用户]

oracleclient库接ORACLE数据库
ORACLE数据库服务器的字符集为AMERICAN_AMERICA.US7ASCII
客服端的字符集也为AMERICAN_AMERICA.US7ASCII
在PL/SQL中中文显示正常,但在vs.net 2005开发时显示为乱码?不知各位达人是否有解(数据库的字符集不能更改)。
尝试过使用ODP.NET,问题一样。
Enterprise Library 也不能解决这个情况
DataRabbit也不能解决
谁能告诉我解决办法
我的邮箱地址:wangmjj@163.com
我的QQ:75799614
  回复  引用    

#14楼 2007-03-20 08:36 henry      

@臭石头
其实现实应用中真的有在千W条数据中进行分吗?虽然数据库有这样级别的数据量,但符合当前需求条件的数据远远达不到这个级别!在客户端进行分页唯一能用的就是DataReader(我所知道的这是ado.net唯一数据记录获取点),DataReader的效率除和记录数有关外,还有一个影响效果更利害的就是当前查询的字段数(遍历一个字段和10个字段的效率可能相差10倍).
  回复  引用  查看    

#15楼 2007-03-20 09:34 亚历山大同志      

@henry
《在客户端进行分页唯一能用的就是DataReader(我所知道的这是ado.net唯一数据记录获取点)》

其实对特定的数据库都有分页的SQL的,但条SQL语句都可以,一般SqlServer都是采用临时表的单条SQL分页的方法,效率会有波动,但是其实Nhibernate也是针对不同的数据库构建不同的单条分页Sql,实在不行的才用遍历DataReader的办法。
  回复  引用  查看    

#16楼 2007-03-20 09:52 臭石头      

@henry
现实中,我的确没见过千万数据,只是听说过而已。
我所接触的系统,电力、自来水等营销系统……自己算吧,每个月每户人家都有至少一条记录。我这里这个城市有五六百万人,我不能确定有多少户。一年下来,数据怎么也有好几百万了吧。还有实时监控系统,可是每分钟好几条数据,比如SCADA。

简单一点的,说网站吧,你看看www.gxep.com.cn这个网站,有些表就有几十万数据,这没什么奇怪的。

或许我说测试千万数据是太夸张了一点,但现实中,几十万数据很正常,百万的也不少。可以问问 亚历山大同志,他见过的系统应该比我多,数据应该更多吧。

你说的“《在客户端进行分页唯一能用的就是DataReader(我所知道的这是ado.net唯一数据记录获取点)》”我不否认,但正如 亚历山大同志 所说,这是下下策。
  回复  引用  查看    

#17楼 2007-03-20 09:59 臭石头      

虽然我对LZ的分页存在怀疑,但总体上说,还是支持LZ的。毕竟,自己做出这个东西来,并不容易。

另外问一句:LZ是不是照着 亚历山大同志 的教程作,然后扩充改进的?

希望LZ继续努力,把DR做得更好
  回复  引用  查看    

#18楼 2007-03-20 10:12 亚历山大同志      

@to ALL
单表千万级数量级已经超过了SqlServer的承载能力,这个时候SqlServer的效率已经开始有所恶化,当然用还是能用,经过优化效率还是能够优化,不过这个时候建议使用Oracle了,我们公司的系统在使用SqlServer的时候为了保持千万级的处理能力使用了库表散列的设计,所以在查询分页上相当的复杂,用了很繁杂的存储过程。老实说个人看法并不建议这么做,换Oracle会更加简便易行。

经过我坚定,此项目系作者自主设计,与我的教程没有关系,希望能提供Source Code供大家研究交流
  回复  引用  查看    

#19楼 2007-03-20 10:16 henry      

@亚历山大同志
其实用MSSQL2005的新特性或Oracle提供的rownum的效果也不见得比DataReader高(所以我一直用DataReader进行分页).
当然面对大量数据分页还是用存储过程高效,毕竟普通一条SQL语句存在逻辑处理方面的限制很难在不同情况中有突破。
实际我想表达的并不是用什么分页高率,而是有没有这个必要!不知道有多少人愿意通过分页的方式定位数据,而不是通过信息条件查询定位数据。
补上:
有这样的数据量,并不代表当前需求真的需要.
我还真没看到用GOOGLE进行查询可以直接跳到99999页(按查询数量算这一页一定有的,但Google确没有这样做)
  回复  引用  查看    

#20楼 2007-03-20 10:18 Klesh Wong      

@臭石头
好慢,图片都打不开。
  回复  引用  查看    

#21楼 2007-03-20 13:45 金色海洋(jyk)      

GOOGLE 支持100页内的数据,100页以外的就没有数据了(不管查询结果有多少)。

可以通过URL里面的参数直接跳到某一页。
  回复  引用  查看    

#22楼 2007-03-20 13:51 wang-seraph[未注册用户]

能说说轻量级和重量级的区别么?   回复  引用    

#23楼 2007-07-11 19:54 haha[未注册用户]

一个建议,提供一个比较好的Sample

getsun的例子实在不敢恭维........
数据库连接在cs文件中。 .
我开始还纳闷,难道还自动查找数据库?

登陆居然用的是自动编号的id,输入个用户名getsun居然出错,无法将String转化成Int32......

一个好的sample能够极大程度上的扩大DataRabbit的影响力,
比如像ActionPack的swf演示.

  回复  引用    

#24楼 2007-07-11 22:47 wang.seraph[未注册用户]

呃,的确不敢恭维
不过也难得热心

这个框架思路很棒,细节部分有待于作者优化改进
  回复  引用    

#25楼 2007-09-23 10:05 www.oxsoft.cn[未注册用户]

没有一个3。0的完整DEMO吗?   回复  引用    

#26楼 2007-12-04 09:49 oxsoft.cn[未注册用户]

开源才是硬道理!   回复  引用    

#27楼 2008-04-22 14:58 Alex wu      

希望楼主能把你的插件框架拿出来讲讲,真的,非常期望看到。   回复  引用  查看    

#28楼 2009-02-25 13:31 许维光      

关于使用生成器的问题
我的机子装了sql2000 以及vs 2008自带2005
现在我想选择sql2000里的数据表
生成器如何设置??
  回复  引用  查看    

#29楼 2009-04-30 14:24 只睡5小时      

DataRabbit.dll
3.2 和3.3的2个版本我都下了,但是

3.2的版本号是:3.2.0.19685
3.3的版本号是:3.2.0.17143

不解》
  回复  引用  查看    

#30楼 2009-05-20 10:05 caoxch[未注册用户]

能提供一下源码吗?   回复  引用    

#31楼 2009-06-05 17:22 flyingbug[未注册用户]

@亚历山大同志
@to ALL
单表千万级数量级已经超过了SqlServer的承载能力,这个时候SqlServer的效率已经开始有所恶化,当然用还是能用,经过优化效率还是能够优化,不过这个时候建议使用Oracle了,我们公司的系统在使用SqlServer的时候为了保持千万级的处理能力使用了库表散列的设计,所以在查询分页上相当的复杂,用了很繁杂的存储过程。老实说个人看法并不建议这么做,换Oracle会更加简便易行。

经过我坚定,此项目系作者自主设计,与我的教程没有关系,希望能提供Source Code供大家研究交流
--------------------------------------------------------------

对于你的言论,不敢苟同. SqlServer2008 实际上与 Oracle 在数据承载量上已经是同一数量级,甚至还要高些.
您是否真正了解过数据库的内部机制呢?很多时候是表设计得不合理导致效率问题的.
  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 680013




相关文章:

相关链接: