0

使用 tglman 的 OrientDB 库并尝试运行示例代码 @ https://github.com/tglman/orientdb-c/wiki/Start

https://github.com/tglman/orientdb-c

我可以连接到数据库并成功设置 + 检索 orientDB 中的值 -

但是,当我使用 运行查询时o_database_document_query,它并没有完成执行——而是无限期地挂起。

如何解决这个问题?

由于它是一个多线程库,可能会发生一些死锁。

在代码中,它具有o_engine_get_factoryo_engine_get_storageo_database_operation_context......等概念

我不太熟悉这些概念或它是如何工作的。

任何想法如何进行???

4

3 回答 3

1

我想你可以猜到我是谁(从我的昵称)

o_engine_get_factory、o_engine_get_storage、o_database_operation_context

是三个不同的概念:

o_engine_get_factory:是基于您使用的协议的“连接工厂”,现在只支持东方“远程”

o_engine_get_storage:是 o_storage 的工厂,它是 orient db 实例的低级接口。

o_datebase_operation_context:是与数据库的高级接口,用于管理文档和客户端事务!

该协议的实际实现在 o_storage_remote.c 和 o_query_engine_remote.c 内部,我认为您必须查看第二个以尝试发现有关问题的一些信息!

您测试的内容可以提供一些代码示例,以便我可以重现/调试!

坦克再见

tglman

于 2013-09-26T14:44:33.017 回答
1

我也调试了,发现了同样的问题……修复并推送到github上!

于 2013-09-29T04:07:49.963 回答
0

我已经找到了错误。它在查询后检索记录的“元数据”时发生:o_database_document_query

这是我的测试代码:

https://gist.github.com/willmoss/6735670

我把socket输入/输出debug了,大家看看问题出在哪里。

https://gist.github.com/willmoss/6735553

在 o_database.c 中,函数 o_database_metadata() 中的第 290 行,您创建了一个空白记录o_storage_get_metadata_rid

https://github.com/tglman/orientdb-c/blob/master/src/o_database.c

然后下一行,您尝试使用 . 从数据库中检索此空白记录o_database_load

图书馆挂在线上int select_ret = epoll_wait(selector->epoll, events, 1, timeout); - 因为没有信息从数据库返回。第 64 行。

https://github.com/tglman/orientdb-c/blob/master/src/o_native_socket_selector.c

如果您查看在 RECORD_LOAD 之后发送到服务器的字节输出流,它只是 '0's ,没有数据(参见最后一节)。

https://gist.github.com/willmoss/6735553

我可以在这里问一个问题吗?这段代码如何为您工作?或者可能是因为协议发生了一些变化。我正在使用OrientDB Server v1.5.1 (build @BUILD@).

另外 - 最重要的是 - 如何解决这个问题?:D

干杯!

于 2013-09-27T21:36:54.333 回答