首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RavenDB缓存?“陈腐”?为什么更新后的文档不随更新一起返回?

RavenDB缓存?“陈腐”?为什么更新后的文档不随更新一起返回?
EN

Stack Overflow用户
提问于 2012-04-02 04:53:49
回答 2查看 908关注 0票数 1

我正在尝试将我自己的博客从MSSQL/EF转换为RavenDB,到目前为止,它基本上是无痛的,但我怀疑它不是“过时的索引”,就是过于自信的缓存,但我无法得到任何实际的答案。当我不知道实际问题是什么时,演示要比解释容易得多。

设置:

代码语言:javascript
复制
// Basic example class
public class ExampleClass{
    public int ID {get;set;}
    public string Value {get;set;}
}

// Once at application startup:
_docStore = new DocumentStore {
    Url = "http://localhost:8080",
    DefaultDatabase = "exampleDB",
    Credentials = new NetworkCredential("userfoo","passbar"),
    };            
_docStore.Initialize();

// Querying data:    
using (var session = _docStore.OpenSession())
{
    var results = _session.Query<ExampleClass>().ToList();        
    foreach(var result in results)
    {
        Console.WriteLine(string.Format("ID #{0}: {1}",
          result.ID, result.Value));
    }
}

的问题是:每当我通过_docStore会话以编程方式更新文档时,就会正常工作。当我从外部(来自另一个客户端,在RavenDB管理工作室等)编辑数据时,文档更新不会被返回。这里有一些例子。

1)数据库中的初始值

数据库中的文档:

  • ExampleClass/1 { "ID":1,“值”:"foo",}
  • ExampleClass/2 { "ID":2,“值”:"bar",}

运行查询;控制台结果:

  • ID #1:foo
  • ID #2:bar

( 2)通过_docStore会话将ExampleClass/2值更新为"BAR“之后。

数据库中的文档:

  • ExampleClass/1 { "ID":1,“值”:"foo",}
  • ExampleClass/2 { "ID":2,“值”:"BAR",}

运行查询;控制台结果:

  • ID #1:foo
  • ID #2:BAR

3)通过RavenDB studio将ExampleClass/2值更新为"bah“

数据库中的文档:

  • ExampleClass/1 { "ID":1,“值”:"foo",}
  • ExampleClass/2 { "ID":2,"Value":"bah",}

运行查询;控制台结果:

  • ID #1:foo
  • ID #2:BAR

4)在通过RavenDB studio添加ExampleClass/3之后

数据库中的文档:

  • ExampleClass/1 { "ID":1,“值”:"foo",}
  • ExampleClass/2 { "ID":2,“值”:"bah",}
  • ExampleClass/3 { "ID":3,“值”:“垃圾邮件”,}

运行查询;控制台结果:

  • ID #1:foo
  • ID #2:BAR
  • ID #3:垃圾邮件

5)在通过RavenDB studio删除ExampleClass/2之后

数据库中的文档:

  • ExampleClass/1 { "ID":1,“值”:"foo",}
  • ExampleClass/3 { "ID":3,“值”:“垃圾邮件”,}

运行查询;控制台结果:

  • ID #1:foo
  • ID #3:垃圾邮件

( 6)通过RavenDB studio更改ExampleClass/3值后

数据库中的文档:

  • ExampleClass/1 { "ID":1,“值”:"foo",}
  • ExampleClass/3 { "ID":3,“值”:“垃圾邮件”,}

运行查询;控制台结果:

  • ID #1:foo
  • ID #3:垃圾邮件

6)在通过RavenDB studio添加ExampleClass/4之后

数据库中的文档:

  • ExampleClass/1 { "ID":1,“值”:"foo",}
  • ExampleClass/3 { "ID":3,“值”:“垃圾邮件”,}
  • ExampleClass/4 { "ID":4,“值”:"bar",}

运行查询;控制台结果:

  • ID #1:foo
  • ID #3:
  • ID #4:bar

*7)初始化新DocumentStore (无数据更改)*

数据库中的文档:

  • ExampleClass/1 { "ID":1,“值”:"foo",}
  • ExampleClass/3 { "ID":3,“值”:“垃圾邮件”,}
  • ExampleClass/4 { "ID":4,“值”:"bar",}

运行查询;控制台结果:

  • ID #1:foo
  • ID #3:
  • ID #4:bar

希望这在事情出了问题的地方表现得足够好。添加和删除整个文档很好,但是更新在第一次加载之后完全被忽略,这使我怀疑缓存而不是“陈旧的索引”.但我尝试过这样的方法却没有运气:

代码语言:javascript
复制
// After initialising document store:
_docStore.DisableAggressiveCaching();
_docStore.DatabaseCommands.DisableAllCaching();
_docStore.Conventions.DefaultQueryingConsistency =
  ConsistencyOptions.QueryYourWrites;

// Whenever opening a new session:
_session.Advanced.DatabaseCommands.DisableAllCaching();
_session.Advanced.AllowNonAuthoritativeInformation = false;                

// When querying:
var result = _session.Query<ExampleClass>()
  .Customize(x=>x.WaitForNonStaleResults())
  .ToList();

$#*是怎么回事?为什么RavenDB恨我?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-02 08:41:24

RavenDB正在进行缓存,但它是通过检查etag来实现的,因此您不应该看到这一点。是否有可能您总是使用单个会话?

你能试着复制这个吗?

票数 2
EN

Stack Overflow用户

发布于 2012-04-03 12:09:39

看起来,与Oren的建议相匹配的docStore.OpenSession()总是返回相同的会话。使用当前的(1.0.701) RavenDB库解决了这个问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9971052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档