一、什么是EseNt
EseNt(Extensible Storage Engine)是一个原生支持Windows的嵌入式数据库引擎,属于非关系型数据库(NoSql),运行于Windows平台。性能和可靠性已经受住了时间的考验,每秒可以执行大约10万次插入操作够变态。
EseNt数据库引擎遵循开源软件规则,可通过以下网址下载或查看更多的详细:
http://managedesent.codeplex.com/
msdn的Api描述:
http://msdn.microsoft.com/en-us/library/gg269245%28v=EXCHG.10%29.aspx
附:性能测试
建表Users,包含四个字段,1整形,2字符串,1日期型.
在不加查询索引的情况下:插入30万条记录,用时15s,插入90万条记录,耗时48s,CPU占用率为30%+-
添加主键索引和一个text类型的查询索引:插入3万条记录,耗时3.4s,插入30W条记录,用时17.19s, CPU占用率为30%+
还是对Users表,表内插入100W条记录,对一个Text字段进行查询,耗时0.39s+-,但对30W条记录作对象序列化时用了3.2s+-.
二、EseNt在C#中应用
EseNt作为Windows平台的数据库引擎,使用C#可以方便将它集成到我们的项目中来,为我们的应用服务。
从http://managedesent.codeplex.com/下载esent开发包,解压得到两个.dll文件:Esent.Collections.dll, Esent.Interop.dll,从这两个文件的命名,我们可以清楚的知道它们的用途,
Esent.Collections.dll为数据容器包,Esent.Interop.dll为用到的API函数集合,将这两个文件引用到项目中来。
OK, 现在可以让esent为我们的应用服务了。
一般,在应用中,我们分几步来使EseNt为我们工作:
1、创建一个实例对象:
在esent里提供了函数用于完成此项功能:
Api.JetCreateInstance(out instance, InstanceKey);
同时通过JetSetSystemParameter函数设置此实例的一些属性,如下代码设置了当时实例删除不需要用到的日志
Api.JetSetSystemParameter(instance, JET_SESID.Nil, JET_param.CircularLog, 1, null);
采用JetInit对当前实例初始化,使instance可用
Api.JetInit(ref instance);
2、开始一个会话对象:
通过Api.JetBeginSession开始一个实例的会话
Api.JetBeginSession(instance, out sesid, null, null);
3、应用实例对象和会话对象进行数据库的操作:
3.1、创建数据库
Api.JetCreateDatabase(sesId, FullDbName, null, out dbId, CreateDatabaseGrbit.OverwriteExisting);
3.2、打开数据库
注意:在打开数据库前,得先用Api.JetAttachDatabase将备用数据库附加到当前会话,不然会引发 No such database 异常.
Api.JetAttachDatabase(sesId, FullDbName, AttachDatabaseGrbit.None);
Api.JetOpenDatabase(sesId, FullDbName, null, out dbId, OpenDatabaseGrbit.None);
3.3、创建表
JET_TABLEID table;
Api.JetCreateTable(sesId, dbId, "users", 0, 100, out table);
3.4、打开表
此处用了打开表时的只读属性,在读时会应该快一些吧~
Api.JetOpenTable(sesId, dbId, "users", null, 0, OpenTableGrbit.ReadOnly, out table);
3.5、创建表结构
Api.JetBeginTransaction(sesId);
JET_COLUMNDEF columndef = new JET_COLUMNDEF();
JET_COLUMNID columnId;
JET_COLUMNID columnName;
JET_COLUMNID columnBirthday;
JET_COLUMNID columnRemark;
columndef.coltyp = JET_coltyp.Long;
columndef.cp = JET_CP.ASCII;
Api.JetAddColumn(sesId, table, "Id", columndef, null, 0, out columnId);
columndef.coltyp = JET_coltyp.Text;
columndef.cp = JET_CP.Unicode;
Api.JetAddColumn(sesId, table, "Name", columndef, null, 0, out columnName);
columndef.coltyp = JET_coltyp.DateTime;
columndef.cp = JET_CP.ASCII;
Api.JetAddColumn(sesId, table, "Birthday", columndef, null, 0, out columnBirthday);
columndef.coltyp = JET_coltyp.LongText;
columndef.cp = JET_CP.Unicode;
Api.JetAddColumn(sesId, table, "Remark", columndef, null, 0, out columnRemark);
Api.JetCommitTransaction(sesId, CommitTransactionGrbit.None);
通过以上的话句创建了一个 users表的数据结构,其中包括了字段: Id,整型 Name,255长度的通用码 Birthday,日期类型 Remark,2G长度的通用码
3.6、插入数据信息
Api.JetBeginTransaction(sesId);
Api.JetPrepareUpdate(sesId, table, JET_prep.Insert);
Api.SetColumn(sesId, table, columnId, 1);
Api.SetColumn(sesId, table, columnName, "毛哥哥", Encoding.Unicode);
Api.SetColumn(sesId, table, columnRemark, "毛哥哥,中国革命家、战略家、理论家和诗人,中国毛哥哥、中国人民解放军和中华人民共和国的主要缔造者和领袖,毛哥哥思想的主要创立者。字润之(原作咏芝,后改润芝),笔名子任。1893年出生于湖南省长沙府湘潭县韶山冲,1976年逝世于北京。从1949年到1976年,毛哥哥是中华人民共和国的最高领导人。他对马克思列宁主义的发展、军事理论的贡献以及对毛哥哥的理论贡献是毛哥哥思想最重要的组成部分。毛哥哥被视为现代世界历史中最重要的人物之一,《时代》杂志将他评为20世纪最具影响100人之一。", Encoding.Unicode);
Api.SetColumn(sesId, table, columnBirthday, new DateTime(1893,7,1));
Api.JetUpdate(sesId, table);
Api.JetCommitTransaction(sesId, CommitTransactionGrbit.None);
通过以上代码写对已创建的Users表写入一条记录.
3.7、查询
3.8、读取数据
4、资源回收
在使用完资源回收是个很好的习惯,建议大家在代码中很好的贯彻这个习惯,使你的应用更加健壮.
4.1、表资源回收
一般在使用完表后就回收
Api.JetCloseTable(sesId, table);
4.2、数据库资源回收
Api.JetCloseDatabase(sesId, dbId, CloseDatabaseGrbit.None);
4.3、结束会话对象
Api.JetEndSession(sesId, EndSessionGrbit.None);
4.4、清空实例对象
Api.JetTerm(instance);
EseNt(Extensible Storage Engine)是一个原生支持Windows的嵌入式数据库引擎,属于非关系型数据库(NoSql),运行于Windows平台。性能和可靠性已经受住了时间的考验,每秒可以执行大约10万次插入操作够变态。
EseNt数据库引擎遵循开源软件规则,可通过以下网址下载或查看更多的详细:
http://managedesent.codeplex.com/
msdn的Api描述:
http://msdn.microsoft.com/en-us/library/gg269245%28v=EXCHG.10%29.aspx
附:性能测试
建表Users,包含四个字段,1整形,2字符串,1日期型.
在不加查询索引的情况下:插入30万条记录,用时15s,插入90万条记录,耗时48s,CPU占用率为30%+-
添加主键索引和一个text类型的查询索引:插入3万条记录,耗时3.4s,插入30W条记录,用时17.19s, CPU占用率为30%+
还是对Users表,表内插入100W条记录,对一个Text字段进行查询,耗时0.39s+-,但对30W条记录作对象序列化时用了3.2s+-.
二、EseNt在C#中应用
EseNt作为Windows平台的数据库引擎,使用C#可以方便将它集成到我们的项目中来,为我们的应用服务。
从http://managedesent.codeplex.com/下载esent开发包,解压得到两个.dll文件:Esent.Collections.dll, Esent.Interop.dll,从这两个文件的命名,我们可以清楚的知道它们的用途,
Esent.Collections.dll为数据容器包,Esent.Interop.dll为用到的API函数集合,将这两个文件引用到项目中来。
OK, 现在可以让esent为我们的应用服务了。
一般,在应用中,我们分几步来使EseNt为我们工作:
1、创建一个实例对象:
在esent里提供了函数用于完成此项功能:
Api.JetCreateInstance(out instance, InstanceKey);
同时通过JetSetSystemParameter函数设置此实例的一些属性,如下代码设置了当时实例删除不需要用到的日志
Api.JetSetSystemParameter(instance, JET_SESID.Nil, JET_param.CircularLog, 1, null);
采用JetInit对当前实例初始化,使instance可用
Api.JetInit(ref instance);
2、开始一个会话对象:
通过Api.JetBeginSession开始一个实例的会话
Api.JetBeginSession(instance, out sesid, null, null);
3、应用实例对象和会话对象进行数据库的操作:
3.1、创建数据库
Api.JetCreateDatabase(sesId, FullDbName, null, out dbId, CreateDatabaseGrbit.OverwriteExisting);
3.2、打开数据库
注意:在打开数据库前,得先用Api.JetAttachDatabase将备用数据库附加到当前会话,不然会引发 No such database 异常.
Api.JetAttachDatabase(sesId, FullDbName, AttachDatabaseGrbit.None);
Api.JetOpenDatabase(sesId, FullDbName, null, out dbId, OpenDatabaseGrbit.None);
3.3、创建表
JET_TABLEID table;
Api.JetCreateTable(sesId, dbId, "users", 0, 100, out table);
3.4、打开表
此处用了打开表时的只读属性,在读时会应该快一些吧~
Api.JetOpenTable(sesId, dbId, "users", null, 0, OpenTableGrbit.ReadOnly, out table);
3.5、创建表结构
Api.JetBeginTransaction(sesId);
JET_COLUMNDEF columndef = new JET_COLUMNDEF();
JET_COLUMNID columnId;
JET_COLUMNID columnName;
JET_COLUMNID columnBirthday;
JET_COLUMNID columnRemark;
columndef.coltyp = JET_coltyp.Long;
columndef.cp = JET_CP.ASCII;
Api.JetAddColumn(sesId, table, "Id", columndef, null, 0, out columnId);
columndef.coltyp = JET_coltyp.Text;
columndef.cp = JET_CP.Unicode;
Api.JetAddColumn(sesId, table, "Name", columndef, null, 0, out columnName);
columndef.coltyp = JET_coltyp.DateTime;
columndef.cp = JET_CP.ASCII;
Api.JetAddColumn(sesId, table, "Birthday", columndef, null, 0, out columnBirthday);
columndef.coltyp = JET_coltyp.LongText;
columndef.cp = JET_CP.Unicode;
Api.JetAddColumn(sesId, table, "Remark", columndef, null, 0, out columnRemark);
Api.JetCommitTransaction(sesId, CommitTransactionGrbit.None);
通过以上的话句创建了一个 users表的数据结构,其中包括了字段: Id,整型 Name,255长度的通用码 Birthday,日期类型 Remark,2G长度的通用码
3.6、插入数据信息
Api.JetBeginTransaction(sesId);
Api.JetPrepareUpdate(sesId, table, JET_prep.Insert);
Api.SetColumn(sesId, table, columnId, 1);
Api.SetColumn(sesId, table, columnName, "毛哥哥", Encoding.Unicode);
Api.SetColumn(sesId, table, columnRemark, "毛哥哥,中国革命家、战略家、理论家和诗人,中国毛哥哥、中国人民解放军和中华人民共和国的主要缔造者和领袖,毛哥哥思想的主要创立者。字润之(原作咏芝,后改润芝),笔名子任。1893年出生于湖南省长沙府湘潭县韶山冲,1976年逝世于北京。从1949年到1976年,毛哥哥是中华人民共和国的最高领导人。他对马克思列宁主义的发展、军事理论的贡献以及对毛哥哥的理论贡献是毛哥哥思想最重要的组成部分。毛哥哥被视为现代世界历史中最重要的人物之一,《时代》杂志将他评为20世纪最具影响100人之一。", Encoding.Unicode);
Api.SetColumn(sesId, table, columnBirthday, new DateTime(1893,7,1));
Api.JetUpdate(sesId, table);
Api.JetCommitTransaction(sesId, CommitTransactionGrbit.None);
通过以上代码写对已创建的Users表写入一条记录.
3.7、查询
3.8、读取数据
4、资源回收
在使用完资源回收是个很好的习惯,建议大家在代码中很好的贯彻这个习惯,使你的应用更加健壮.
4.1、表资源回收
一般在使用完表后就回收
Api.JetCloseTable(sesId, table);
4.2、数据库资源回收
Api.JetCloseDatabase(sesId, dbId, CloseDatabaseGrbit.None);
4.3、结束会话对象
Api.JetEndSession(sesId, EndSessionGrbit.None);
4.4、清空实例对象
Api.JetTerm(instance);