Lmdb mdb_从一个进程获取成功,但从另一个长时间运行的进程获取失败

Lmdb mdb_从一个进程获取成功,但从另一个长时间运行的进程获取失败,lmdb,Lmdb,我们在ARM设备上有两个进程A和进程B。 是一个长时间运行的进程,它将报告来自lmdb的数据。 每当有查询时,我们都执行mdb_get(key)并返回结果。 mdb_获得回报-30798 进程B是查询lmdb的CLI工具。同一个键上的mdb_get(key)在该过程中工作良好 其中一个不同之处是生成了进程B,创建了txn,调用了mdb_get(),中止了txn,进程退出 A和B都以只读方式打开lmdb 我能够逐步完成mdb_get()代码。mdb_节点_搜索在进程A中失败,而在进程B中成功。密钥

我们在ARM设备上有两个进程A和进程B。 是一个长时间运行的进程,它将报告来自lmdb的数据。 每当有查询时,我们都执行mdb_get(key)并返回结果。 mdb_获得回报-30798

进程B是查询lmdb的CLI工具。同一个键上的mdb_get(key)在该过程中工作良好

其中一个不同之处是生成了进程B,创建了txn,调用了mdb_get(),中止了txn,进程退出

A和B都以只读方式打开lmdb

我能够逐步完成mdb_get()代码。mdb_节点_搜索在进程A中失败,而在进程B中成功。密钥数很小-20

有人能帮我检查一下mdb中的哪些内容吗?
提前感谢。

-30798是MDB_NOTFOUND错误

用进一步的数据很难回答你的问题。 你的数据库是完全静态的吗?没有其他流程进行更改/插入/删除

我应该猜一个答案吗?你现在的处境是这样的:

  • 进程A启动它自己的事务(和读卡器),因此它在进程启动时具有数据的“映像”
  • 另一个进程使用另一个事务将新数据放入数据库
  • 进程A将永远不会看到新数据,除非它中止并重新启动新事务

流程B(CLI工具)始终有效这一事实很容易理解:在执行时,它启动一个新事务,该事务具有“所有以前提交的事务的最新映像”。

对,谢谢。进程A也会在每次尝试读取时启动一个新的事务,然后在读取完成后提交事务。