goleveldb 在关闭并重新打开数据库时无法将数据写入数据库

问题描述 投票:0回答:1

我正在使用 go leveldb 实现:goleveldb。 github.com/blevesearch/goleveldb 或 github.com/syndtr/goleveldb。 我正在做一个相当简单的练习。使用 OpenFile() 创建并打开数据库,然后使用 Put 写入,关闭并重新打开它,并尝试使用 Get 读取相同的密钥。路径名和密钥是相同的。我可以连续对数据库执行 Put 和 Get 操作来证明它具有数据。我还完成了 Batch.Write()。我写的东西很小。大概是128字节。密钥为 32 字节。我尝试在关闭文件并重新打开它之前睡 10 秒钟。我已经使用 storage.Open(path, false) 显式创建了存储,然后执行了 Open(stor, nil)。我还将“写入”选项设置为“同步”,以便刷新文件。我在 Ubuntu Linux 上运行。对于多次写入的情况,我还没有看到过这种情况。在这些情况下,重新打开文件时数据仍然存在。但是,在这些情况下,我通常会重新启动该进程,并且没有显式关闭数据库。 数据库或 storage.Storage 接口没有显式的刷新。 有点困惑。下面的代码片段。只需打开一个新数据库,进行写入读取(或在同一键上进行多次读取),关闭数据库和存储,然后进行新的打开并尝试读取。失败并显示 leveldb.ErrNotFound。

在下面的代码中,我显式创建了存储,但也仅使用

leveldb.OpenFile(path, nil)
进行了尝试,并提供了指向默认选项块的指针。

spath := path.Join(basepathname, dbpathname)`
stor, err := storage.OpenFile(spath, false)`     

if ldb, err1 := leveldb.Open(stor, nil); err1 != nil {         
    panic("Failed open of shard index: " + err1.Error())     
}     
//......     
batch := new(leveldb.Batch)     
batch.Put([]byte(key), []byte{<some data})     
opt := opt.WriteOptions     
opt.Sync = true     
if err2 = ldb.Write(batch, &opt); err2 != nil{
     panic(er2.Error())     
}     
v, err3 := ldb.Get([]byte(key)     
if err3 != nil {panic(err3.Error())}     
// this succeeds - can do it repetitively      
//......     
lrd.Close()     
stor.Close()                
stor, err := storage.OpenFile(spath, false)     
if err != nil {panic(err.Error())}     
if ldb, err1 := leveldb.Open(stor, nil); err1 != nil {         
    panic("Failed open of shard index: " + err1.Error())     
}     
v, err3 := ldb.Get([]byte(key)     
if err3 != nil {panic(err3.Error())}     
// fails with the Not Found error from leveldb
go leveldb
1个回答
0
投票

找到答案了。 OpenFile 的选项包括 WriteBuffer 值。默认为 4 MiB。我将它设置为小得离谱的 256 字节。现在,在关闭和打开后可以正确写入和检索数据。我无法告诉的是,在常规使用中如何知道缓冲区何时最终刷新到磁盘,以便程序关闭数据库并关闭。解决方法可能是在关闭之前写入空数据,并在重新打开时删除,或者可能只是每次都覆盖它。

© www.soinside.com 2019 - 2024. All rights reserved.