2013-08-31 80 views
1

我需要與其他C++和遠程Java應用程序連接C++應用程序如下:格式相同

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消息格式?

回答

2

這取決於您存儲的內容以及訪問方式。如果app(1)一次寫入整個數據庫,並且app(2)只讀取整個數據並將其發送出去,那麼可能沒有理由將數據庫存儲在sqlite中。您可以將它存儲爲一個大Thrift,Protobuf或JSON blob。您可能希望以與您在(3)和(4)之間使用它相同的格式存儲它,以便不需要翻譯。但如果應用程序(1)需要增量修改數據庫或稍後再讀取它的某些部分,或者如果應用程序(2)需要搜索數據庫中的特定鍵,那麼您可能想要堅持使用sqlite。 Thrift,Protobuf和JSON都是一次寫入格式 - 您一次寫完整條消息,並且一次讀完所有消息。你不能在原地更新這樣的文件;你必須將整個事物讀入內存,在那裏修改它,然後寫一個全新的文件。您也無法高效地搜索特定的行 - 同樣,您必須一次將整個內容讀入內存。

但是,是的,將數據庫文件以thrift/protobuf/json格式而不是sqlite存儲是絕對好的做法,只要它符合您的使用案例。另一種可能是將數據庫存儲爲sqlite格式,但將各個行存儲爲本身處於Thrift,Protobuf或JSON格式的Blob。例如,您的數據庫可能只有兩列:主鍵和「內容」blob。內容blob是以不同格式編碼的字節blob,因此您不必在模式之間進行繁瑣的翻譯。這樣,您仍然可以通過主鍵搜索數據庫。

+0

1.事實上,在Java應用程序聯機的情況下,sqlite是某種緩衝。 2.您是否考慮到有MongoDB具有json格式?它仍然是一次寫入? – userbb

+0

如果sqlite數據庫的目的只是成爲一個緩衝區,那麼我認爲跳過sqlite並以最終RPC將使用的任何格式直接寫入是明智的。是的,你也可以使用MongoDB來存儲緩衝區,但是這看起來好像將編碼的protobufs /節點作爲字節blob存儲在sqlite中一樣。如果它只是一個緩衝區,你根本不需要數據庫。 –

相關問題