fastCSharp 1.6 内存数据库引擎及代码生成实例 发布

showjim 2014-02-26 08:44:15
如果你的服务器有大量空闲内存,会不会有一种可耻的感觉呢?如果内存不够大,应该花点钱买买这种感觉。
大内存相比于硬盘,不仅仅是程序跑得更快,更重要的是有效利用大内存能让程序开发更快捷。长期来说,节省的开发人工成本,相比于内存价格还是很划算的。
看看现在市面上出现了各种各样的内存数据库,忍不住凑了个热闹。花了一些时间写了个可嵌入的内存数据库物理引擎,以及代码生成实例。由于本人与C#版主caozhy有过不愉快,所以发到这个版块来了。

1.支持嵌入模式,也就是可以不需要服务端,直接本地函数调用。
2.支持代码生成模式与反射模式,反射模式序列化性能相比于代码生成模式可能相差2倍以上。
3.序列化采用二进制序列化,添加成员识别的二进制序列化性能相差在40%以下。
4.客户端在通讯层实现了并发请求合并处理

以往的代码生成实例一样,采用自定义属性配置环境参数,比如
[fastCSharp.setup.cSharp.memoryDatabase(CacheType = typeof(fastCSharp.memoryDatabase.cache.identityArray<,>), FileName = null, MinRefreshSize = 1, ClientType = typeof(fastCSharp.memoryDatabase.physicalClient<identity>), IsEmbed = false, IsIndexSerialize = true)]
对于代码生成模式,数据库操作代理就是 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 fastCSharp.memoryDatabase.PhysicalClient<identity>(), 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+字节,成员识别二进制序列化数据大概350+字节。
采用10W对象数据为单位做写入测试,总数据量100W单线程循环10次。
对于远程模式分别测试了客户端单线程与多线程并发。
测试机 Inter(R) Celeron(R) M CPU 520 1.60GHz,测试耗时包括 物理层处理 + 网络通讯处理 + 客户端对象创建与序列化处理 + 简单的缓存同步更新操作。
代码生成模式+成员识别二进制序列化 [10W对象 + 序列化数据35M] 同步测试结果 / 异步测试结果
本地模式  1线程:平均耗时 0.7s,CPU 100%
远程模式 1线程:平均耗时 5.3s / 6.7s,CPU 100%
远程模式 2线程:平均耗时 3.4s / 5.5s,CPU 100%
远程模式 5线程:平均耗时 2.4s / 3.6s,CPU 100%
远程模式 10线程:平均耗时 2.1s / 2.6s,CPU 100%
远程模式 20线程:平均耗时 1.8s / 1.9s,CPU 100%
远程模式 25线程:平均耗时 1.8s / 1.9s,CPU 100%
远程模式 40线程:平均耗时 1.9s / 1.8s,CPU 100%
远程模式 50线程:平均耗时 2.2s / 1.8s,CPU 100%
远程模式 80线程:平均耗时 2.3s / 1.8s,CPU 100%
远程模式200线程:平均耗时 2.8s / 2.0s,CPU 100%
远程模式500线程:平均耗时 3.5s / 2.9s,CPU 100%
代码生成模式+普通二进制序列化 [10W对象 + 序列化数据12M] 同步测试结果
本地模式  1线程:平均耗时  0.53s,CPU 100%
远程模式 1线程:平均耗时 4.9s,CPU 100%
远程模式 2线程:平均耗时 3.1s,CPU 100%
远程模式 5线程:平均耗时 1.9s,CPU 100%
远程模式 10线程:平均耗时 1.5s,CPU 100%
远程模式 20线程:平均耗时 1.4s,CPU 100%
远程模式 25线程:平均耗时 1.4s,CPU 100%
远程模式 40线程:平均耗时 1.3s,CPU 100%
远程模式 50线程:平均耗时 1.3s,CPU 100%
远程模式 80线程:平均耗时 1.4s,CPU 100%
远程模式200线程:平均耗时 1.8s,CPU 100%
远程模式500线程:平均耗时 2.8s,CPU 100%
反射模式+成员识别二进制序列化 [10W对象 + 序列化数据35M] 同步测试结果
本地模式  1线程:平均耗时 2.9s,CPU 100%
远程模式 1线程:平均耗时 8.4s,CPU 100%
远程模式 20线程:平均耗时 4.3s,CPU 100%
远程模式 40线程:平均耗时 4.3s,CPU 100%
远程模式 80线程:平均耗时 4.6s,CPU 100%
反射模式+普通二进制序列化 [10W对象 + 序列化数据12M] 同步测试结果
本地模式  1线程:平均耗时  3.1s,CPU 100%
远程模式 1线程:平均耗时 8.4s,CPU 100%
远程模式 20线程:平均耗时 4.2s,CPU 100%
远程模式 40线程:平均耗时 4.2s,CPU 100%
远程模式 80线程:平均耗时 4.4s,CPU 100%
...全文
920 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪狐 2014-05-15
  • 打赏
  • 举报
回复
Mark一下,以备学习之用!
风一样的大叔 2014-02-28
  • 打赏
  • 举报
回复
我是来学习的
showjim 2014-02-26
  • 打赏
  • 举报
回复
补充说明:测试结果有点虚,我的本本0.7s可写不了35M数据,因为windows2003操作系统有硬盘写入缓冲,程序跑完了硬盘还要闪一阵。 而对于读取测试,可以手动清除操作系统硬盘缓存,我的本本读取35M数据需要2s。
目 录 第一章 开发环境 1.1 Qt 简介5 1.2 下载安装 Qt Creator 6 1.3 第一个程序 Hello World 7 第二章 窗体应用 1.1 窗体基类说明 12 1.2 控制窗体大小 13 1.3 窗体初始位置及背景色 13 1.4 修改标题栏图标 14 1.5 移动无边框窗体 16 1.6 去掉标题栏中最大化、最小化按钮 17 1.7 多窗体调用 18 1.8 字体形状窗体 20 第三章 控件应用 1.1 QPushButton按钮 23 1.2 QLabel标签 23 1.3 QLineEdit单行文本 24 1.4 QTextEdit多行文本 25 1.5 QPlainTextEdit多行文本 26 1.6 QComboBox下拉列表框 26 1.7 QFontComboBox字体下拉列表框 27 1.8 QSpinBox控件 28 1.9 QTimeEdit时间控件 29 1.10 QDateEdit日期控件 30 1.11 QScrollBar控件 30 1.12 QRadioButton单选按钮 31 1.13 QCheckBox复选框 32 1.14 QListView 列表控件 34 1.15 QTreeView树控件 34 1.16 QTableView表格控件 35 1.17 QHBoxLayout横向布局 36 1.18 QGridLayout网格布局 37 1.19 QGroupBox控件 38 1.20 QTabWidget控件 39 1.21 QMenu、QToolBar控件 41 1.22 任务栏托盘菜单 43 第四章 组件应用 1.1日历组件 47 1.2登录窗口 48 1.3文件浏览对话框 50 1.4颜色选择对话框 51 1.5进度条实例53 1.6Timer实时更新时间 54 第五章 文件操作 1.1创建文件夹 57 1.2写入文件 58 1.3修改文件内容 60 1.4删除文件 62 1.5修改文件名 63 1.6 INI文件写入操作 65 1.7 INI文件读取操作 68 1.8创建XML文件 71 1.9读取XML文件 72 第六章 图形图像操作 1.1绘制文字 75 1.2绘制线条 75 1.3绘制椭圆 77 1.4显示静态图像 78 1.5显示动态图像 78 1.6图片水平移动 79 1.7图片翻转 80 1.8图片缩放 82 1.9图片中加文字 84 1.10图像扭曲 85 1.11模糊效果 85 1.12着色效果 86 1.13阴影效果 87 1.14透明效果 87 第七章 多媒体应用 1.1音频、视频播放器 90 1.2播放Flash动画 94 1.3播放图片动画 95 第八章 系统操作 1.1获取屏幕分辨率 98 1.2获取本机名、IP地址 98 1.3根据网址获取IP地址 99 1.4判断键盘按下键值 100 1.5获取系统环境变量 101 1.6执行系统命令 102 第九章 注册表 1.0简要说明注册表 105 1.1写入注册表 105 1.2查找注册表 106 1.3修改IE浏览器的默认主页 107 第十章 数据库基础 1.1查询数据库驱动 109 1.2Qodbc连接Access数据库 109 1.3插入数据 111 1.4数据列表 112 1.5操作SQLite数据库 113 1.6SQLite数据库视图管理器 115 第十一章 网络开发 1.1点对点聊天服务端 119 1.2点对点聊天客户端 123 1.3局域网广播聊天 128 1.4SMTP协议发送邮件 148 1.5调用系统DLL判断网络连接状态 152 第十二章 进程与线程 1.1进程管理器 155 1.2线程QThread应用 158 1.3线程QRunnable应用 159 第十三章 数据安全 1.1 QByteArray加密数据 163 1.2 AES加密数据 164 1.3 MD5 加密数据 165 1.4 生成随机数 166 第十四章 打包部署 1.1 FilePacker 打包 169 1.2 Inno Setup 打包 174
所有需求全部来自生产实际,源自生产,贴近实战,提高技能。 生产案例生产库A是一台2012年的数据库服务器,存储是戴尔sc8000数据量有20T。数据库版本是11.2.0.3,该数据库是单实例数据库。使用操作系统目录存储,没有使用ASM存储。需要进行数据库服务器和存储迁移。迁移到新服务器和新存储。迁移到新的rac环境,使用本地方式进行升级。 目标:我们需要迁移数据库A到新服务器,新存储。 源库A数据库版本11.2.0.3数据库类型单实例数据存储使用操作系统目录存储,非ASM存储容量20TosRhel6 目标库B数据库版本19.19数据库类型Rac数据存储ASM容量21TOsRhel7 难点。1-数据库服务器需要进行替换2-存储需要进行替换3-容量大,存储没有多余空间,只能才有原地升级方式4-版本跨度大,需要从11203->11204->1919单实例->1919-pdb-rac. 具体步骤1-源服务器数据库命令行创建11203数据库软件2-源服务器数据库命令行创建11203数据库实例3-在目标服务器克隆源库11.2.0.3数据软件。并且在目标服务器搭建源库的dg库。4-开始真正的割接,割接的时候没有业务的。激活11203dg为主库。5-升级11203到112046-升级11204到19.197-配置19.19单实例数据库为rac数据库中的某个pdb。Over. 针对以前学员提出文档不全的意见,其实文档都是有的,都已经上传到百度网盘。这次实战课程整理文档如下:0-创建源库11203单实例1-通过克隆方式在目标服务器rac上面创建11203数据库软件2-在目标库rac数据库上面创建11203的单实例的dg3-目标库rac安装11204单实例软件和升级11203到112044-11204升级到19c数据库

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧