说明:
数了一下,有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锁住插入/更新/删除,这些步骤,使的同一时间只出现一个链接打开。
但是,通过今天的示例,发现了,读取,也是要打开链接的。
因此,优化并没有止步,本系列还在继续,请继续关注。
复制代码