一年前,当我们开始使用RavenDB时,我们很快在 生产环境 中遇到了这个错误:
操作失败:无法访问文件,文件被锁定或正在使用中
我们通过一些论坛发现,我们可以通过不将RavenDB作为IIS网站运行,但作为一项服务来摆脱这种情况 . 我们做了,再也没见过错误 .
到现在为止:我正在 Build 一个新的环境和想法,我会在IIS上运行RavenDB,但错误很快就会重新出现 .
事实和我尝试过的事情:
-
在商业许可证上运行v.30155
-
使用自定义AppPool(称为RavenApplicationPool)
-
将数据文件夹与IIS目录分开(通过
Raven/WorkingDir
AppSetting) -
RavenApplicationPool用户对IIS文件夹和数据文件夹都具有"Full control"权限
-
为网站安装并启用了Windows身份验证
-
overlapped recycle disabled for app-pool
未安装 -
webdav-publishing(根据setup docs中的要求)
-
击中我的键盘(没有运气)
当站点运行几分钟时,错误会随机发生 . 尝试使用以下命令还原备份时也会发生此问题:
C:\ RavenDBExecutables \ Server \ raven.Server.exe --restore-source = c:\ SOME_PATH \ my-db-backup.raven --restore-database-name = my-db --restore-database = http: //本地主机:8080
(RavenDBExecutables文件夹只是二进制文件/可执行文件等的压缩文件 - 它与IIS网站文件夹不重叠)
运行还原时,会创建以下文件夹:
-
IndexDefinitions(包含许多以.index结尾的文件)
-
索引(许多带整数名称的文件夹)
-
logs(空)
-
系统(空)
-
temp(空)
-
根文件夹(my-db)为空,即没有数据文件,.resource.database或raven-data.ico,与工作db一样
导入失败后,如果我访问http://localhost:8080/docs/Raven/Restore/Status,我会得到
许多行如“复制PATH_TO_INDEX_FILE”,
“Esent Restore:Failure!无法恢复数据库!”,“Microsoft.Isam.Esent.Interop.EsentFileAccessDeniedException:无法访问文件,文件被锁定或正在使用\ r \ n在Microsoft.Isam.Esent.Interop.Api . 检查(Int32错误)\ r \ n在Microsoft.Isam.Esent.Interop.Api.JetRestoreInstance(JET_INSTANCE实例,字符串源,字符串目标,JET_PFNSTATUS statusCallback)\ r \ n在Raven.Database.Storage.Esent.Backup . RestoreOperation.Execute()“,”无法恢复数据库无法访问文件,文件被锁定或正在使用“
那可能是什么?
1 回答
发生这种情况的原因是IIS默认情况下会重叠循环 . 这意味着应用程序的两个版本都在运行(并且两者都在尝试使用相同的资源) . 将重叠的再循环设置为false,这不应该发生 . 当用户将两个数据库设置为同一路径时,我们已经看到类似的错误