我的项目文件放在我的Dropbox文件夹中,因此我也可以在办公室里玩我的文件。

我的项目包含一个EmbeddableDocumentStore,其中UseEmbeddedHttpServer设置为true

const int ravenPort = 8181;
NonAdminHttp.EnsureCanListenToWhenInNonAdminContext(ravenPort);
var ds = new EmbeddableDocumentStore {
    DataDirectory = "Data",
    UseEmbeddedHttpServer = true,
    Configuration = { Port = ravenPort }
};


现在,这一天,当我在办公室电脑上启动项目时,我看到了以下消息:Could not open transactional storage: D:\Dropbox\...\Data

由于它处于开发的早期阶段,因此我删除了Dropbox上的data文件夹,并且项目开始顺利。现在我回到家,遇到了同样的问题!我当然不想每次都删除该文件夹。

我不能将开发数据存储在我的Dropbox上吗?我应该绕过一些东西使它起作用吗?

最佳答案

将数据目录设置为本地计算机上的物理磁盘卷。您将无法使用任何种类的映射驱动器,网络共享,UNC路径,Dropbox或skydrive作为数据目录。仅仅因为您有驱动器号并不意味着您有物理磁盘。

甚至有意义的唯一非物理存储类型是通过iSCSI或FibreChannel从SAN附加的LUN,或在虚拟化或云环境中附加的VHD。它们都将作为物理磁盘出现在OS中。

几乎任何数据访问环境都是这种情况。如果您不相信我,请尝试使用SQL Server。在RavenDB的情况下,它使用ESENT作为其数据存储,这需要直接访问文件系统。

更新资料

需要说明的是,即使您存储在物理磁盘上,也不能依赖任何类型的同步技术,例如DropBox或SkyDrive。为什么?因为它们将对文件采取共享的读取锁定,以监视更改。 ESENT之类的技术(RavenDB所基于的技术)要求对该文件具有排他锁。

其他技术,例如SQL Server和Windows虚拟机,也对其数据存储使用独占锁定。为什么?因为它们不断以随机访问的方式读取和写入数据位。您是否真的希望DropBox尝试对数据的每一位更改执行同步操作?这将是非常低效和有问题的。

使用共享锁的应用程序不会出现此问题。例如,当您处理MS Word文档时,所有操作都在内存中完成。保存文件时,DropBox可以读取整个文件并将其同步到云中。它可以通过仅发送已更改的位来进行优化,但是仍然需要能够读取文件才能执行此操作。

因此,如果DropBox在ESENT文件上具有共享的读取锁,那么当RavenDB尝试专门打开它时,它将收到错误并引发您所看到的异常。

关于c# - Dropbox上的Embedded Raven DataDirectory无法100%工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14347280/

10-13 05:26
查看更多