目前对BerkeleyDb在NET下应用研究,单机环境下,一般应用已经没问题了。在我的普通开发机器上。对BerkeleyDb数据库,并发写150个线程,并发读4000个线程,一点问题没有。而且这不是并发性能测试的极限,是我测试的最大数据,肯定是还可以在提高的,只是我就测试更大的并发读写数量。
当然了这原不是BerkeleyDb的真实性能。只有使用c 或c++调用BerkeleyDb才能得到他的真实性能测试。据说使用c++。BerkeleyDb的读写并发完全可以支持到上千个线程。
在NET下使用BerkeleyDb,第一步是先对BerkeleyDb的调用做一个合理的封装。网上下的BerkeleyDb for NET 0.95 调用起来真是太麻烦了。如此麻烦的调用方式在实际开发中意义不是很大。只有做好在进一步的封装。成为如下形式。
ControlBerkeleyDb.AddNewKeyList(aa1, GetConfigNews.GetappSettings(EnvCBD), EnvCBD.db, Error.txt, 0, 52428800, BerkeleyDbType.DbBTree);
EnvDb ED = ControlBerkeleyDb.GetEnvDb(aa1);
ED.MyDbBTree.Put(null, ref key, ref data)
简化调用步骤的复杂性,才是更好的方式。这样单机应用是没问题了。但是最近研究的是如何在多台服务器下实现缓存同步。目前实验项目以成功。得到的一些经验和设想如下。
首先如果使用BerkeleyDb数据库。最好是可以在服务器上可以使用一个独立的硬盘。防止其他程序和BerkeleyDb数据库产生IO竞争。BerkeleyDb可是非常消耗磁盘空间的的程序。数据库文件本身不用说。给每个环境划分的缓存可是都不小的开销。
为了保证BerkeleyDb的最稳定。我的做法是一个数据库对应一个环境。不在一个环境内加载多个数据库。或者是一个环境中不加载三个数据库,最多加载两个。每个环境的缓存视保留的数据类型和数据量设定。一般在50兆到800兆之间人为变动。
现在有一些类库。是专门用来做分布式缓存的。比如Memcached。但是现在是要用BerkeleyDb来实现,只好走一些苯方法了。
一个站点,使用负载均衡,用5台服务器来对同一个域名的站点进行服务。那么只好在5个服务器上都建立各自的BerkeleyDb数据库文件。当用户随即被解析到一个服务器上进行web请求处理的时候。如果产生了BerkeleyDb数据改变的逻辑,那么在通知其他四台服务器。一起更新BerkeleyDb数据库。这个时候是不能用web servers的。应为你不能指定您的请求被解析到具体哪台服务器上。
只能用Socket象一个指定的ip地址,发送一个有指定主机头的get请求。并在请求内加好需要的参数。
一般是每个站点都会定义一个http处理程序,用来解析一种特殊的后缀名的文件。比如 dafault.berkeleydb?Id=445555&type=4 。这样的文件和请求。这样的请求就是专门的BerkeleyDb缓存同步指令了。
每台服务器都有自己的ip地址列表。这样几台服务器之间互相传递这样的get请求,就可以保证缓存同步了。用异步委托来发送这样的请求。保证主线程不在Socket上消耗时间。
补充一点,在64位的操作系统上,其实不用在从编译BerkeleyDb的64位c源码文件。就是编译成功64位的c语言DLL。在64的NET环境下。想使用也是很不容易的。
这个项目是公司的项目。我就不能把项目源码打包让大家下载了。不过过几天。在业务时间,我就在写一套BerkeleyDb封装使用的项目。让大家下载。可以看代码。感叹一下写BerkeleyDb for NET 0.95的哪个老外。确实很强啊。