日期:2014-05-20  浏览次数:20912 次

fastCSharp 1.6 内存数据库引擎及代码生成实例 发布
如果你的服务器有大量空闲内存,会不会有一种可耻的感觉呢?如果内存不够大,应该花点钱买买这种感觉。
大内存相比于硬盘,不仅仅是程序跑得更快,更重要的是有效利用大内存能让程序开发更快捷。长期来说,节省的开发人工成本,相比于内存价格还是很划算的。
看看现在市面上出现了各种各样的内存数据库,忍不住凑了个热闹。花了几天时间写了个可嵌入的内存数据库物理引擎,以及代码生成实例。codeplex连不上,连续提交3个小时了,只好上传到了51nod。

1.支持嵌入模式,也就是可以不需要服务端,直接本地函数调用。
2.支持代码生成模式与反射模式,反射模式序列化性能相比于代码生成模式可能相差4倍以上。
3.序列化现在支持二进制与JSON两种模式。因为二进制序列化不能识别成员变化,只能用于稳定的类型定义,所以暂时采用JSON序列化弥补,以后有时间在增加一个专用的序列化程序。代码生成模式中JSON序列化性能相比于二进制序列化可能相差2倍以上,序列化生成的数据量也可能相差3倍以上。

和以往的代码生成实例一样,采用自定义属性配置环境参数,比如
        [fastCSharp.setup.cSharp.memoryDatabase(CacheType = typeof(fastCSharp.memoryDatabase.cache.identityArray<,>), FileName = null, MinRefreshSize = 1, MaxLogCacheSize = 0, ClientPoolType = typeof(clientPool), IsEmbed = false, IsJsonSerialize = false)]
对于代码生成模式,数据库操作代理就是 Model.memoryDatabase.Default,比如
            private static memoryDatabase db = memoryDatabase.Default;
对于反射模式,数据库操作代理需要自己创建。嵌入模式与远程模式的数据库代理分别如下
            private static fastCSharp.setup.cSharp.memoryDatabase.localTable<identity, int> db = fastCSharp.setup.cSharp.memoryDatabase.table.Open(new setup.cSharp.memoryDatabase.localTable<identity, int>(new fastCSharp.memoryDatabase.cache.identityArray<identity>()));
            private static fastCSharp.setup.cSharp.memoryDatabase.remoteTable<identity, int> db = fastCSharp.setup.cSharp.memoryDatabase.table.Open(new setup.cSharp.memoryDatabase.remoteTable<identity, int>(new clientPool(), new fastCSharp.memoryDatabase.cache.identityArray<identity>()));
性能测试,采用的数据定义如下
        public abstract class data
        {
            public bool Bool;
            public byte Byte;
            public sbyte SByte;
            public short Short;
            public ushort UShort;
            public int Int;
            public uint UInt;
            public long Long;
            public ulong ULong;
            public DateTime DateTime;
            public float Float;
            public double Double;
            public decimal Decimal;
            public Guid Guid;
            public char Char;
            public string String;
            public bool? BoolNull;
            public byte? ByteNull;
            public sbyte? SByteNull;
            public short? ShortNull;
            public ushort? UShortNull;
            public int? IntNull;
            public uint? UIntNull;
            public long? LongNull;
            public ulong? ULongNull;
            public DateTime? DateTimeNull;
            public float? FloatNull;
            public double? DoubleNull;
            public decimal? DecimalNull;
            public Guid? GuidNull;
            public char? CharNull;
        }
当成员String为null的时候,二进制序列化数据大概120+字节,Unicode编码的JSON序列化数据大概580+字节。
嵌入模式 与 远程模式+缓存模式[缓存模式相当于批量处理] 采用10W对象数据为单位做写入测试,远程模式采用1W对象数据为单位做写入测试。数据库操作代理采用单线程循环模式进行单机测试,测试机 Inter(R) Celeron(R) M CPU 520 1.60GHz,测试耗时包括 物理层处理 + 网络通讯处理 + 客户端对象创建与序列化处理。
代码生成模式(要求性能的选择)测试结果