标签: ravendb

我应该将RavenDB作为Windows服务还是通过IIS运行?

我正在使用RavenDB作为应用程序的数据存储的想法,该应用程序很可能具有HTML UI,WebService UI和将访问数据的服务器实用程序.使用RavenDB的一个原因是它通过复制和分片提供的水平扩展.但是,似乎有几个关于将Raven作为Windows服务运行或通过IIS运行的考虑因素.

  • 安全性 - Raven服务更安全或使用IIS允许我更灵活地通过IP地址,.NET成员资格等进行限制.
  • 缓存 - 似乎IIS是此功能的更好选择
  • 架构 - 由于我不希望任何第三方访问数据存储,因此通过IIS公开Raven真的很有意义.此外,Raven与各种UI和实用程序之间会有一个业务层,因此涉及IIS似乎是不必要的,可能会引入不必要的复杂性.
  • 性能 - IIS管道可能比Windows服务在每个请求上有更多的开销
  • 扩展 - 使用IIS可能更难以跨多个服务器扩展,而不是仅使用小批量文件安装Raven服务

EDITED

我可以理解使用Raven的嵌入式配置,如果您拥有的只是一个Web客户端,但是当您拥有多个不同的客户端时,Raven的API需要独立公开以防止单个客户端锁定数据文件.

architecture ravendb

15
推荐指数
2
解决办法
2247
查看次数

RavenDB:在内存中获取异常文档存储"Voron在32位模式下容易出现故障."

遵循RavenDB的文档后

http://ravendb.net/docs/article-page/2.5/csharp/samples/raven-tests/createraventests

我无法成功通过内存文档存储的创建来运行单元测试.我使用RavenDB的RavenTestBase复制并粘贴了上面文档中的测试样本.

[TestClass]
public class IndexTest : RavenTestBase
{
    [TestMethod]
    public void CanIndexAndQuery()
    {
        using (var store = NewDocumentStore())
        {
            new SampleData_Index().Execute(store);

            using (var session = store.OpenSession())
            {
                session.Store(new SampleData
                {
                    Name = "RavenDB"
                });

                session.SaveChanges();
            }

            using (var session = store.OpenSession())
            {
                var result = session.Query<SampleData, SampleData_Index>()
                    .Customize(customization => customization.WaitForNonStaleResultsAsOfNow())
                    .FirstOrDefault();

                Assert.Equals(result.Name, "RavenDB");
            }
        }
    }
}

public class SampleData
{
    public string Name { get; set; }
}

public class SampleData_Index : AbstractIndexCreationTask<SampleData>
{
    public SampleData_Index()
    { …
Run Code Online (Sandbox Code Playgroud)

unit-testing ravendb

15
推荐指数
1
解决办法
1664
查看次数

RavenDB ASP.NET会话提供程序?

一点背景:我目前使用Memcached Providers来管理ASP.NET应用程序中的会话状态.它提供了使用SQL Server作为回退存储机制的工具(当需要从memcached缓存中清除会话时).我想看看为RavenDB创建一个提供程序,因为它对于这类任务会更高效.

我的问题是,有没有人实施这样的事情?(或类似的东西?) - 我讨厌重新发明轮子.谷歌没有产生任何有用的结果(除了在RavenDB组本身中的这个问题),所以我想我会直接把这个问题带到Stack Overflow社区.

asp.net session nosql ravendb

14
推荐指数
1
解决办法
2072
查看次数

RavenDB网络访问

我很难找到有关如何让RavenDB在网络上工作的信息.在同一个网络中,我可以运行我的应用程序实例,它将显示来自我的RavenDB的数据.但是,当我尝试写入数据时,我收到了401 Unauthorized异常.

设置要通过网络访问的RavenDB的正确方法是什么?

现在,我在Raven.Server.exe.config中有这个,这只是一个短期解决方案:

<add key="Raven/AnonymousAccess" value="All" />
Run Code Online (Sandbox Code Playgroud)

我不明白的是,RavenDB网站说使用这样的东西:

<connectionStrings>
  <add name="RavenDb" 
       connectionString="Url=http://serverName:8080;user=user;password=password"/>
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

好的,这对正在运行的应用程序很有用,但是如何设置RavenDB服务器以允许该用户和密码?这是错误的做法(以某种方式设置RavenDB配置文件以允许这些凭据)?如果这是错的,我应该如何在服务器端定义凭据?

编辑:以下是我的尝试和结果:

我通过双击Raven.Server.exe来运行RavenDB.

场景1

客户端app.Config:

  <connectionStrings>
    <add name="RavenDb" connectionString="Url = http://server:8080;domain=Xx;user=Xx\user;password=pw"/>
  </connectionStrings>
Run Code Online (Sandbox Code Playgroud)

DocumentStore设置:

DocumentStore documentStore = new DocumentStore();
documentStore.ConnectionStringName = "RavenDb";
documentStore.Initialize();
Run Code Online (Sandbox Code Playgroud)

保存操作:

Session.Store(objectToSave);
Run Code Online (Sandbox Code Playgroud)

结果:"远程服务器返回错误:(401)未经授权."

情景2

客户端app.config:

<add key="databaseUrl" value="http://server:8080"/>
Run Code Online (Sandbox Code Playgroud)

DocumentStore设置:

string databaseUrl = ConfigurationManager.AppSettings["databaseUrl"];            
DocumentStore documentStore = new DocumentStore();
documentStore.Url = databaseUrl;
documentStore.Initialize();
Run Code Online (Sandbox Code Playgroud)

保存操作:

Session.Store(objectToSave);
Run Code Online (Sandbox Code Playgroud)

结果:"远程服务器返回错误:(401)未经授权." 内部异常:"目标主体名称不正确"

ravendb

14
推荐指数
1
解决办法
4659
查看次数

应用程序启动时的RavenDB和陈旧索引

我有一个应用程序:

  • 使用嵌入式RavenDB数据库
  • 使用Monotonic读取选项
  • 使用静态索引

我注意到,当应用程序启动时,即使它们在应用程序关闭(干净地)上一次运行时没有过时,索引也都会暂时失效.

例如,我运行应用程序,插入10条记录,并等待索引是最新的.我查询它并查看我期望的结果.然后我关闭应用程序,再次启动它,并查询,我没有得到任何结果.一秒钟之后,索引已经更新,我现在可以得到结果.如果我重复这个,有时我会得到10个结果,有时会得到0个结果,有时会得到2个结果

我的假设是,当在时间T查询索引时,我总是会在T + 1看到"至少一致"的结果.但是如果服务器在此期间重新启动,我似乎看到在T + 1处的结果不太一致.这不是最终的一致性,它最终是不一致的!:)

我的问题是:

  1. 我的假设是错误的/愚蠢的吗?
  2. 有没有办法防止这种情况发生?
  3. 这种行为只是一个启动的事情,还是可能随时发生?例如,我可以渲染10个结果,然后刷新0结果,然后10个结果再次刷新,因为Raven决定重新索引所有内容吗?

eventual-consistency ravendb

14
推荐指数
1
解决办法
560
查看次数

RavenDB:子文档的Id生成

我正在尝试迁移现有的Web应用程序以使用RavenDB.

我目前在我的Web应用程序中有页面,允许您根据查询字符串中的id查看Categories,SubCategories和Resources.

但是我注意到RavenDB为聚合根生成了id,但是没有为子实体生成id.

我不认为子类别是聚合根(类别具有子类别),因此我将其作为我的类别文档的子文档.

我错误地将其作为子文档,因为我通过查询字符串传入的id直接访问它?但如果没有,我应该如何访问单个SubCategories,因为RavenDB似乎不为非聚合根的实体生成id?

nosql document-database ravendb

13
推荐指数
2
解决办法
1897
查看次数

RavenDB跟踪更改绕过验证

我正在试图获得使用RavenDB的应用程序框架.我已经设置了一个业务逻辑服务,它与会话具有1对1的关系,并且有效地成为工作抽象的单元.

部分业务逻辑服务将包含所有验证.服务的方法可能是这样的

    public void StoreUser(User user)
    {
        //Some validation logic
        if(string.IsNullOrWhiteSpace(user.Name))
            throw new Exception("User name can not be empty");

        Session.Store(user);
    }
Run Code Online (Sandbox Code Playgroud)

问题在于,因为用户一旦被存储就会被跟踪,我可以绕过存储方法的任何验证但是存储正确的值然后稍后更改它

    public void TestUserStore()
    {
        var u1 = new User() {Name = "John"};
        var u2 = new User() { Name = "Amy" };

        Service.StoreUser(u1);
        u1.Name = null; //change is tracked and will persist on the next save changes
        Service.StoreUser(u2);
        Service.SaveChanges();

        //The following fails, as we have stored null as the name rather than "John" bypassing our validation
        Assert.IsTrue(Service.AdhocQuery<User>().Any(u => …
Run Code Online (Sandbox Code Playgroud)

ravendb

13
推荐指数
1
解决办法
442
查看次数

NoSql/Raven数据库实施最佳实践

我正在调查一个新的项目,这将是一个社交网络风格的网站.我正在阅读RavenDb,我喜欢它的很多功能.我没有读过nosql这么多,但我想知道它是否适合最适合的利基,旧学校sql仍然是其他东西的最佳选择.

我认为权限插件对于社交网络风格的网站来说是理想的 - 但是它真的会在数据库受到重创的环境中执行 - 或者它是否针对更可靠的报告风格系统进行了优化在数据库中投放新的数据结构并报告这些结构.

我渴望使用正确的工具 - 我将使用MVC3,Windsor + Nhibernate + Sql server或RavenDb.

我应该坚持使用旧的学校sql还是和街区的新孩子一起去:ravendb?

database architecture nosql ravendb

12
推荐指数
1
解决办法
2164
查看次数

基本的NoSQL文档设计问题

我正在试图弄清楚如何最好地为我的系统实现这个...并且现在让我的脑袋离开RDBMS空间......

我当前数据库的一部分有三个表:Show,ShowEntry和Entry.基本上,ShowEntry是Show和Entry之间的多对多连接表.在我的RDBMS中认为这是合乎逻辑的,因为对Show细节的任何更改都可以在一个地方完成,而在Entry中也是如此.

在基于文档的存储中反映这一点的最佳方法是什么?我确信没有一种方法可以做到这一点,但我不禁想到,基于文档的存储是否适用于这种情况.

仅供参考,我目前正在考虑实施RavenDB.虽然关于一般NoSQL设计的讨论会很好,但RavenDB的重点将更加精彩!

感谢:D.

nosql ravendb

12
推荐指数
2
解决办法
1406
查看次数

使用Raven DB的数据访问体系结构

我可以使用哪些数据访问体系结构与Raven DB一起使用?

基本上,我想通过接口分离持久性,所以我不会将下划线存储暴露给上层.即我不希望我的域看到来自Raven DB的IDocumentStoreIDocumentSession.

我已经实现了通用存储库模式,这似乎有效.但是,我不确定这是否是正确的方法.也许我会去命令查询隔离或其他什么?

你的想法是什么?

c# architecture data-access-layer ravendb

12
推荐指数
1
解决办法
1813
查看次数