核心接口
public interface IPut { string Key { get; } }
BDBManager 完整實現
public class BDBManager : IDisposable
{
private readonly string _dir, _dbName;
private DbBTree _btree;
private Txn _txn;
private Db _db;
private Env _env;
private readonly BinaryFormatter _formatter = new BinaryFormatter();
private readonly MemoryStream _keyStream = new MemoryStream();
private readonly MemoryStream _dataStream = new MemoryStream();
private bool _committed;
public BDBManager(string dir, string dbName)
{
_dir = dir; _dbName = dbName;
InitEnv(); InitStreams();
}
void InitEnv()
{
_env = new Env(EnvCreateFlags.None);
Env.OpenFlags flags = Env.OpenFlags.Create | Env.OpenFlags.InitLock | Env.OpenFlags.InitLog
| Env.OpenFlags.InitMPool | Env.OpenFlags.InitTxn | Env.OpenFlags.Recover;
_env.Open(_dir, flags, 0);
_txn = _env.TxnBegin(null, Txn.BeginFlags.None);
_db = _env.CreateDatabase(DbCreateFlags.None);
_btree = (DbBTree)_db.Open(_txn, _dbName, null, DbType.BTree, Db.OpenFlags.Create, 0);
}
void InitStreams() { /* formatter, keyStream, dataStream 已在字段初始化 */ }
// Set / Get / Remove / Find / Commit / Dispose 完整代碼見原文
// 關鍵邏輯:
// - 序列化 Key/Value 到 MemoryStream
// - DbEntry.InOut/Out 包裝字節數組
// - btree.Put/Get/Delete/Cursor 操作
// - BufferSmall 時擴容 MemoryStream 重試
// - Dispose 時自動 Commit
}
關鍵技術細節
| 環節 | 處理 |
| 序列化 | BinaryFormatter + MemoryStream,避免文件 IO |
| 事務 | Env.TxnBegin → 所有操作共用 _txn → Commit/Rollback |
| 游標遍歷 | DbBTreeCursor.Get(Next) + BufferSmall 動態擴容 |
| 資源釋放 | IDisposable → Dispose → Commit → db.Close → env.Close |
適用場景
- 嵌入式 Key-Value 存儲,單機、高性能、支持事務。
- .NET Core 跨平台需改用
BerkeleyDB.NET 或 LMDB、RocksDB 托管封裝。
- 上一篇文章: C# 使用 BerkeleyDB(六):完整調用示例與實體類設計
- 下一篇文章: C# 使用 BerkeleyDB(四):游標遍歷 Find 實現
Copyright ©
程式碼之家 All Rights Reserved