为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
白猪掌柜的 2021-08-23 15:57:56
我已经在我的项目中实现了 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 来启用多线程阅读?写作呢?如果不可能进行多线程写入,我不会感到惊讶,但多线程读取似乎应该如此。我在这里做错了什么?
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

您要么需要关闭数据库文件,要么对其使用全局实例,您不能多次打开该文件,但是您可以从多个 goroutine 访问同一个实例。


查看完整回答
反对 回复 2021-08-23
  • 1 回答
  • 0 关注
  • 255 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信