性能优化篇:access的并发极限及超级分库分散并发方案(十六)(2)

发表于:2012-02-13来源:博客园作者:路过秋天点击数: 标签:性能测试
说明: 数了一下,有8个,常用的基本都是一个表一个数据库,不常用的就还在一起一个数据库。 其实,秋色园QBlog 的分库,都是在写这篇文章之前分的,

  说明:

  数了一下,有8个,常用的基本都是一个表一个数据库,不常用的就还在一起一个数据库。

  其实,秋色园QBlog 的分库,都是在写这篇文章之前分的,也就是说,当初分库的时候,我并不知道access的最大极限。

  虽然我曾一度的百度及google过access的并发数或性能上限,但是,出来的网页结果,都没有我要的答案,于是我仅靠猜。

  每次我见到秋色园QBlog打不开时,我都可以清楚的见到qblog.ldb文件,黄金4K的ldb文件,一开始我以为是4个并发锁住了。

  于是我也曾搜索去找到ldb的相关答案,可惜,仍找不到我要的答案,但是我知道黄金4K的ldb文件这个问题很严重。

  于是,在秋色园QBlog 那个漫长的过程中,我是一步一步的分的库,因为缺少真实的理解,我靠想象与猜测是某个表产生了死锁引起的,因此我的第一理念,是把某个表分离出来。

  因此,虽然现在你看到有8个库,但这不是一次分出来的:

  实际是某当qblog.mdb这个主库遇到黄金4K最大锁时,我就在怀疑某个表,然后就把某个表分出一个库出来;

  然后感觉又好了,再过不久,又出来黄金4K最大锁,我又在怀疑是不是某表又锁了,又分出了一个库;

  于是过了好长时间的如此如此般的重复,才最终形成这样的分库结果。

  复制代码

  PS:在发布的CYQ.Blog(QBlog) V3.0 单用户版本中,虽然发布的是一个数据库,但是,隐藏着更高性能的分库功能,即是说,如果想再提升性能,你还可以分库,然后分一个库补充1个链接即可。不过单用户版本,V3.0的性能已经够强悍了,而且同时还支持着多种数据库。

  分库的功臣,Access链接表

  在分库的过程中,不得不提到Access的链接表,如果没有它,分库真的难以想象的复杂。

  复杂在何处?当然是代码的修改了,你能想象分布在两个数据库间的表链接查询?

  用链接表,代码不用改,逻辑不用变,SQL语句仍照样兼容,有点神奇。

  分库步骤(示例分库用户表Blog_User):

  1:新建一数据库:qbloguser.mdb。

  2:打开qbloguser.mdb,菜单:文件->获取外部数据->导入,选择qblog数据库,将用户表导进来,完成表的分库转移。

  3:打开qblog.mdb,删除用户表,然后菜单:文件->获取外部数据->链接表,从qbloguser.mdb中将用户表链接过来。

  复制代码

  OK,1分钟内完成分库并链接表,至此,并没有代码逻辑的修改,但是,仅是这样的分库,是无意义的。

  因为并有没散链接,操作用户表时,还是操作的qblog.mdb数据库,压力并没有分散。

  代码调整,分散单表操作的压力

  代码还是需要调整,首先将表枚举分出来:

  public enum U_QBlogUserEnum

  {

  Blog_User,

  }

  因据 CYQ.Data 的多数据库应用的约定,此表的数据库链接将转向配置项为QBlogUserConn项。

  因此,仅需要多配置多一条数据库链接指向qbloguser.mdb即完成了。

  当然了,原来TableNames.Blog_User语句,批量替换成U_QBlogUserEnum.Blog_User就可以了。

  再当然的话,代码也不可能只改动这么小,因为,必须兼容一个库的情况,比如CYQ.Blog(QBlog) V3.0发布时,

  实际是支持分库操作的,但是最终发布是一个库发布的,因此,兼容的链接也必须处理。

  再有一个提示,就是CYQ.Data 的ResetTable切换表操作功能,由于链接取的上一个,因此在分库的情况下,每个表都是不同的链接,因此ResetTable的表操作,必须独立出来操作。

  复制代码

  强大的 CYQ.Data 数据框架(新提示:V4.0 以下版本免费且开源),仅靠提取表枚举头部,就能自动切换数据库,达到多数据库应用。

  于是,秋色园 QBlog 的Super分库的策略,由此轻松的完成了。

  最终形成的数据库链接如下:

  压力分散是什么情况:

  1:单表操作,分散到独立的数据库链接中,如qbloguser.mdb。

  2:多表操作,直接操作的qblog.mdb的链接表。

  3:每个库都能同时支持64个并发链接。

  复制代码

  总结

  虽然秋色园 QBlog 整个的分库策略,是长时间一步一步分的库,由于原理是一致的,因此此文就一次性上齐了。

  而且写此文前进行的示例测试,有效的为自己和大伙解开access的并发上限之惑,

  同时也解答了,多数库分库的确带来并发上的好处。

  然而分库再怎么厉害,一个库也是支持最大64个链接并发打开。

  虽然:CYQ.Data 用Lock锁住插入/更新/删除,这些步骤,使的同一时间只出现一个链接打开。

  但是,通过今天的示例,发现了,读取,也是要打开链接的。

  因此,优化并没有止步,本系列还在继续,请继续关注。

  复制代码

原文转自:http://www.ltesting.net