初識EseNt
一、什么是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);
浙公網安備 33010602011771號