c# - 我的 Dropbox 上的嵌入式 Raven DataDirectory 不能 100% 工作?

标签 c# ravendb

我的项目文件在我的 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 上的数据文件夹,项目完美地启动了。现在我回到家我遇到了同样的问题!当然,我不想每次都删除这个文件夹。

我不能将我的开发数据存储在我的 Dropbox 上吗?我应该绕过某些东西来让它工作吗?

最佳答案

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

唯一有意义的非物理存储类型是通过 iSCSI 或光纤 channel 从 SAN 附加的 LUN,或者虚拟化或云环境中附加的 VHD。它们都将作为物理磁盘呈现给操作系统。

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

更新

澄清一下,即使您存储在物理磁盘上,也不能依赖任何类型的同步技术,例如 DropBox 或 SkyDrive。为什么?因为他们将对文件进行共享读取锁定以监视更改。像 ESENT(RavenDB 所基于的)这样的技术需要对文件的独占锁

SQL Server 和 Windows 虚拟机等其他技术也对其数据存储进行排他锁定。为什么?因为他们不断地以随机访问的方式向文件读取和写入数据位。您真的希望 DropBox 尝试对每一位数据更改执行同步操作吗?这将是非常低效和有问题的。

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

因此,如果 DropBox 在 ESENT 文件上有一个共享读锁,那么当 RavenDB 试图以独占方式打开它时,它会收到一个错误并引发您所看到的异常。

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

相关文章:

RavenDB : Storage Size Problems

c# - 二进制数相减时判断 "Borrow"

c# - 使用接口(interface)名称创建类实例的概念是什么?

c# - 自定义类型和序列化列表的问题

unit-testing - 单元测试 RavenDB

c# - RavenDb - 状态代码 : NotFound

c# - 使用 documentStore.Conventions.CustomizeJsonSerializer 事件自定义 RavenDB 中的序列化过程

.net-4.0 - 错误 FileAccessDenied(JET_errFileAccessDenied,无法访问文件,文件被锁定或正在使用)

用于在 wpf 数据网格中选择所有复选框的 c# 代码

c# - Task.Wait 的默认超时是多少