1

我需要将 C++ 应用程序与其他 C++ 和远程 Java 应用程序连接起来,如下所示:

1.C++ app --> 2.local sqlite Database --> 3.C++ sender --> 4.Java receiver

所以 1. 应用程序使用 sqlite api 将数据存储到具有某种模式的数据库中。下一个应用程序 3. 读取该模式并将其转换为 thrift/rpc 格式,以便将其发送到应用程序 4。

对我来说,处理 sqlite 中的模式和 thrift/rpc 格式的模式是很痛苦的。是否可以或良好的做法来存储数据,而不是在 sqlite 中,而是在 json 格式的数据库中,并使用相同的格式进行 rpc 消息传递?

4

1 回答 1

2

这在很大程度上取决于您存储的内容以及访问方式。如果 app (1) 一次性写入整个数据库,而 app (2) 只是读取整个内容并将其发送出去,那么可能没有理由将数据库存储在 sqlite 中。您可以将其存储为大的 Thrift、Protobuf 或 JSON blob。您可能希望以在 (3) 和 (4) 之间发送它时使用的相同格式存储它,这样就不需要翻译。

但是如果 app (1) 需要增量修改数据库或稍后读取部分数据库,或者如果 app (2) 需要在数据库中搜索特定键,那么您可能想要坚持使用 sqlite。Thrift、Protobuf 和 JSON 都是一次写入的格式——你一次写完一整条消息,然后一次读回所有消息。您无法就地更新此类文件;您必须将整个内容读入内存,在那里进行修改,然后编写一个全新的文件。您也无法有效地搜索特定行——同样,您必须一次将整个内容读入内存。

但是,是的,以 thrift/protobuf/json 格式而不是 sqlite 存储数据库文件绝对是一个好习惯,如果它适合您的用例。

顺便说一句,另一种可能性是以 sqlite 格式存储您的数据库,但将各个行存储为本身为 Thrift、Protobuf 或 JSON 格式的 blob。例如,您的数据库可能只有两列:主键和“内容”blob。内容 blob 是以不同格式编码的字节 blob,因此您不必在模式之间进行繁琐的转换。这样,您仍然可以通过主键搜索您的数据库。

于 2013-08-31T19:36:53.483 回答