在 Go 中多线程 LevelDB 的合适方法是什么?

我已经在我的项目中实现了 levigo 包装器,所以我可以使用 LevelDB。该声明相当样板,如下所示:


func NewLeveldbStorage(dbPath string) *leveldbStorage {

     opts := levigo.NewOptions()

     opts.SetCache(levigo.NewLRUCache(3<<30))

     opts.SetCreateIfMissing(true)

     log.Debugf("Entering Open")

     db, err := levigo.Open(dbPath, opts); if err != nil {

         log.Fatal("BOOM %v", err)

     }

     log.Debugf("Finished calling open")

     opts.Close()

     return &leveldbStorage{db:db}

 }

这是返回的结构:


type leveldbStorage struct {

     db *levigo.DB

}

然后我在结构上做了一些简单的 GET 和 STORE 命令,它们基本上只使用s.db.Get和s.db.Put。这在我的测试中运行良好,但是当我运行以下基准测试时:


 func BenchmarkLeviDbGet(b *testing.B) {

     s := storage.NewLeveldbStorage("/path/to/db")

     value := "value"

     uid,_ := s.Store(value)


     b.ResetTimer()

     for i := 0; i < b.N; i++ {

         s.Get(uid)

     }

该基准测试在运行时返回:


 2014/10/12 21:17:09 BOOM %vIO error: lock /path/to/db/LOCK: already held by process

有没有合适的方法使用 levigo/leveldb 来启用多线程阅读?写作呢?如果不可能进行多线程写入,我不会感到惊讶,但多线程读取似乎应该如此。我在这里做错了什么?


白猪掌柜的
浏览 259回答 1
1回答

一只甜甜圈

您要么需要关闭数据库文件,要么对其使用全局实例,您不能多次打开该文件,但是您可以从多个 goroutine 访问同一个实例。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go